启动 EC2 应用服务器

AWSBeginner
立即练习

简介

团队需要一台服务器来运行小型报表应用。在本实验中,你将启动 Amazon EC2 实例,通过 SSH 连接,修改应用的问候语,并在 AWS View 中检查响应。最后,你将终止实例并确认最终状态。

你应了解基本终端命令,以及 VPC、子网和安全组的用途。实验环境提供网络、Ubuntu 镜像、SSH 密钥对和应用软件。应用实例由你亲自创建和配置。

认证备考关联

本实验练习通过程序操作 AWS,以及选择 EC2 作为计算服务,对应 AWS Certified Cloud Practitioner CLF-C02 考试领域 3 的任务 3.1 和 3.3。你还将区分镜像、实例类型和运行中的实例。

启动应用实例

在本步骤中,你将检查预置镜像,并在提供的网络中启动一个 EC2 实例。

EC2 实例是一台虚拟服务器。Amazon Machine Image(AMI)提供操作系统和初始软件。实例类型规定计算与内存容量的组合。本实验选择小型通用实例类型 t3.micro 来运行入门应用。

首先进入项目目录:

cd /home/labex/project

launch.env 文件保存预置镜像、子网和安全组的标识符。查看文件,了解即将使用的资源:

cat launch.env

这些值是资源 ID,不同环境中的值会不同。使用 source 将它们加载到当前 shell;该命令会读取文件中的变量赋值:

source launch.env

检查 AMI。--image-ids 用于选择镜像,--query 用于限定显示的字段:

aws ec2 \
  describe-images \
  --image-ids "$AMI_ID" \
  --query 'Images[].{Image:ImageId,Name:Name,Architecture:Architecture}'

确认镜像名称为 report-server-ubuntu-2204,架构为 x86_64。镜像包含 Ubuntu 和报表应用,因此你可以专注于启动和操作服务器。

子网决定实例所在的网络位置。预置安全组允许来自实验访问网络的 SSH 流量(端口 22)和应用请求(端口 8081)。密钥对 report-key 提供安装在实例上的公钥;项目目录中提供了对应私钥,用于 SSH 连接。

使用预置资源启动一个实例。--count 1 创建一台服务器,标签为它设置便于识别的名称 report-server:

aws ec2 \
  run-instances \
  --image-id "$AMI_ID" \
  --instance-type t3.micro \
  --subnet-id "$SUBNET_ID" \
  --security-group-ids "$SECURITY_GROUP_ID" \
  --key-name report-key \
  --count 1 \
  --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=report-server}]'

响应包含新实例的 ID 和初始状态。将实例 ID 保存到 shell 变量中,供后续命令使用。$(...) 会执行括号内的命令并保存输出;--output text 以纯文本形式返回 ID:

INSTANCE_ID=$(aws ec2 \
  describe-instances \
  --filters Name=tag:Name,Values=report-server \
  --query 'Reservations[0].Instances[0].InstanceId' \
  --output text)

检查实例的状态和地址:

aws ec2 \
  describe-instances \
  --instance-ids "$INSTANCE_ID" \
  --query 'Reservations[].Instances[].{Instance:InstanceId,State:State.Name,PrivateIPv4:PrivateIpAddress,PublicIPv4:PublicIpAddress}'

确认状态为 running,并且同时存在私有和公网 IPv4 地址。如果状态仍为 pending,稍等片刻后重复检查命令。私有地址标识 VPC 内的服务器;公网地址是通过实验访问网络连接服务器时使用的目标地址。

连接并配置应用

在本步骤中,你将通过 SSH 连接实例,修改报表应用的问候语,并在 AWS View 中测试响应。

将实例的公网 IPv4 地址保存到另一个 shell 变量:

PUBLIC_IP=$(aws ec2 \
  describe-instances \
  --instance-ids "$INSTANCE_ID" \
  --query 'Reservations[0].Instances[0].PublicIpAddress' \
  --output text)

SSH 建立到服务器的加密终端连接。Ubuntu 镜像使用登录名 ubuntu。预置的 ssh_config 指定私钥和实验连接路径;-F 告诉 SSH 读取该配置文件:

ssh -F ssh_config ubuntu@"$PUBLIC_IP"

终端现在位于应用实例内。确认当前登录用户:

whoami

输出应为 ubuntu。这可以区分应用实例和 LabEx 终端;后者的用户为 labex。

预置应用从 /etc/report-app/config.json 读取问候语。更新这个系统文件需要管理员权限。sudo tee 将以下文本写入文件,两个 JSON 标记之间的 here-document 提供要写入的内容:

sudo tee /etc/report-app/config.json <<'JSON'
{
  "message": "Hello from EC2"
}
JSON

应用在每次请求时重新读取配置。使用 curl 通过实例的回环地址请求健康检查端点:

curl -sS http://127.0.0.1:8081/health

JSON 响应应标识 Report server 服务,并包含 "message": "Hello from EC2"。这说明实例内的应用正在使用你的配置返回响应。

退出 SSH 会话,回到 LabEx 终端:

exit

打开 AWS View,点击 Refresh resources。在实例表中找到 report-server。确认状态为 running,并将它的公网 IPv4 地址与 CLI 返回的地址进行比较。

在 Application requests 下选择运行中的实例,点击 Check application。确认收到包含 Hello from EC2 的 HTTP 200 响应。请求会发送到实例当前的公网地址,同时检查网络连通性和服务器中的应用。

AWS View 显示运行中的 report-server 及配置后的应用响应

示例检查点:应用返回 HTTP 200 和 Hello from EC2。你的资源 ID 和地址会不同。

终止服务器

在本步骤中,你将终止应用实例,并确认它不再运行。

终止操作会永久移除实例。使用之前保存的 ID,只选择你创建的应用服务器:

aws ec2 \
  terminate-instances \
  --instance-ids "$INSTANCE_ID"

响应显示操作前后的状态。AWS CLI 还提供 waiter,它会轮询资源,直到资源达到指定状态。等待终止完成:

aws ec2 \
  wait instance-terminated \
  --instance-ids "$INSTANCE_ID"

条件满足后,waiter 不会输出内容。检查最终状态:

aws ec2 \
  describe-instances \
  --instance-ids "$INSTANCE_ID" \
  --query 'Reservations[].Instances[].{Instance:InstanceId,State:State.Name}'

确认状态为 terminated。实例记录可能在终止后仍可见;这并不表示服务器仍在运行。

在 AWS View 中点击 Refresh resources。实例应显示 terminated,并且不再出现在运行中的应用目标列表中。保留预置网络和密钥对。

总结

你使用 AMI、实例类型、网络资源和 SSH 密钥对启动了 EC2 实例。随后,你连接服务器、配置报表应用,并通过 AWS View 验证响应。最后,你终止实例并确认了最终状态。