在 Amazon Lightsail 上部署 LAMP Web 应用程序

教程

模块 1:创建 Lightsail PHP 应用程序

在本模块中,您将使用 AWS CLI 来配置 LAMP 堆栈

概述

您将使用 AWS CLI 通过已预配置了 LAMP 组件的蓝图创建一个 Lightsail 实例。在创建实例期间,您将从 GitHub 存储库中安装一个 PHP 应用程序。

学习目标

在本模块中,您将:

  • 使用 AWS CLI 创建 Lightsail 实例。
  • 使用实例的用户数据部署 PHP 应用程序。

 完成时间

10 分钟

 模块先决条件

  • 具有管理员级访问权限的 AWS 账户**
  • 推荐的浏览器:最新版 Chrome 或 Firefox

[**] 过去 24 小时内创建的账户可能尚不具有访问此教程所需服务的权限。

操作步骤

如何创建 Lightsail 实例

我们将使用以下 AWS CLI 命令创建 Lightsail 实例:

aws lightsail create-instances \
    --instance-names <name_of_your_instance> \
    --availability-zone <availability_zone> \
    --blueprint-id <blueprint_id> \
    --bundle-id <bundle_id> \
    --key-pair-name <key_pair_name> \
    --user-data <user-data>

该命令需使用以下参数:

  • 实例名称
  • 您希望在其中部署实例的可用区
  • 蓝图 ID
  • 捆绑包 ID
  • 在访问实例时需使用的 SSH 密钥对
  • 以及用户数据(将在实例启动时执行这些用户数据)。


注意:捆绑包是指一组预配置的资源,其决定了 Amazon Lightsail 实例可用的内存、计算能力和存储的数量。而蓝图则是指实例的虚拟机映像。该计算机映像中包括计算机上配置的操作系统和常用软件应用程序。

定义用户数据

如以上命令所示,在创建 Lightsail 实例时,您可以选择向该实例传递用户数据,这些数据可用于执行常见的自动配置任务,甚至可用于在实例启动后运行脚本。

在本例中,用户数据将用于部署 LAMP 堆栈。如下的脚本将执行以下操作:删除蓝图的默认网站;克隆示例应用程序以将其替换;设置适当的文件权限;配置示例应用配置文件中自动生成的数据库密码;并执行 init.sql 脚本以创建数据库和填充初始值。

# remove default website
#-----------------------
cd /opt/bitnami/apache2/htdocs rm -rf *

# clone github repo
#------------------
/usr/bin/git clone -b loft https://github.com/mikegcoleman/todo-php.git .

# set write permissons on the settings file
#-----------------------------------
chown bitnami:daemon ./*
chmod 666 connectvalues.php

# inject database password into configuration file
#-------------------------------------------------
sed -i.bak "s/<password>/$(cat /home/bitnami/bitnami_application_password)/;" /opt/bitnami/apache2/htdocs/connectvalues.php

# create database
#----------------
cat /home/bitnami/htdocs/data/init.sql | /opt/bitnami/mariadb/bin/mysql -u root -p$(cat /home/bitnami/bitnami_application_password)

创建 SSH 密钥对

除用户数据外,我们可能还需要在创建实例后连接该实例。要连接实例,需使用一个 SSH 密钥对。

您可以使用 AWS CLI 来创建 SSH 密钥对。以下命令将为您创建 SSH 密钥,并将公钥保存在 lightsailguide.pub 中,将私钥保存在 lightsailguide 中。

aws lightsail create-key-pair --key-pair-name LightsailGuide > ssh_key_response.json
cat ssh_key_response.json | jq -r '.publicKeyBase64' > lightsailguide.pub
cat ssh_key_response.json | jq -r '.privateKeyBase64' > lightsailguide
chmod 400 lightsailguide.pub lightsailguide

注意:您可能需要使用所选的数据包管理器在计算机上安装 jq(一种灵活的轻量级命令行 JSON 处理器)。

创建 Lightsail 实例

一切准备就绪后,即可使用 AWS CLI 来创建实例。在本指南中,我们将使用 Ireland (eu-west-1) 区域,以及一个 blueprintId 值为 lamp_7 的 LAMP 蓝图。您可以运行以下命令查看可用蓝图的完整列表:

aws lightsail get-blueprints

在创建 Lightsail 实例时,必须指定实例捆绑包。在本指南中,我们将使用 micro_2_0 捆绑包。您可以运行以下命令查看可用捆绑包的列表:

aws lightsail get-bundles

要通过用户数据脚本以及您创建的 SSH 密钥来创建 Lightsail 实例,请运行以下命令:

# Create the Lightsail instance:
aws lightsail create-instances \
    --instance-names "LightsailLampExample" \
    --availability-zone eu-west-1a \
    --blueprint-id lamp_7 \
    --bundle-id micro_2_0 \
    --key-pair-name LightsailGuide \
    --user-data '# remove default website
#-----------------------
cd /opt/bitnami/apache2/htdocs rm -rf *
# clone github repo
#------------------
/usr/bin/git clone -b loft https://github.com/mikegcoleman/todo-php.git .
# set write permissons on the settings file
#-----------------------------------
chown bitnami:daemon ./*
chmod 666 connectvalues.php
# inject database password into configuration file
#-------------------------------------------------
sed -i.bak "s/<password>/$(cat /home/bitnami/bitnami_application_password)/;" /opt/bitnami/apache2/htdocs/connectvalues.php
# create database
#----------------
cat /home/bitnami/htdocs/data/init.sql | /opt/bitnami/mariadb/bin/mysql -u root -p$(cat /home/bitnami/bitnami_application_password)'

该命令将输出您创建的实例的详细信息:

{
    "operations": [
        {
            "id": "a49e1398-fb81-455a-8a50-3159c9bd9966",
            "resourceName": "LightsailLampExample",
            "resourceType": "Instance",
            "createdAt": "2021-09-21T16:38:40.566000+02:00",
            "location": {
                "availabilityZone": "eu-west-1a",
                "regionName": "eu-west-1"
            },
            "isTerminal": false,
            "operationType": "CreateInstance",
            "status": "Started",
            "statusChangedAt": "2021-09-21T16:38:40.566000+02:00"
        }
    ]
}

实例创建需要几分钟时间。您可以运行以下命令检查进度:

aws lightsail get-instance-state --instance-name LightsailLampExample

当显示以下输出内容时,表明实例正在运行,但其可能仍在执行用户数据脚本:

{
    "state": {
        "code": 16,
        "name": "running"
    }
}

要测试应用程序,将需要使用实例的公共 IP 地址。您可以运行以下命令获取实例的公共 IP 地址。

aws lightsail get-instance --instance-name LightsailLampExample | jq -r .instance.publicIpAddress

复制 IP 地址并将其粘贴到浏览器中。您将看到运行中的应用程序:

总结

在此第一个模块中,我们学习了如何使用 AWS CLI 创建基础设施,以及如何部署示例应用程序。在下一个模块中,我们将学习如何清理本指南中使用的资源。

下一模块:清理资源