在 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 地址并将其粘贴到浏览器中。您将看到运行中的应用程序: