管理实例生命周期和地址

AWSBeginner
立即练习

介绍

团队希望在维护期间停止报表服务器,并在恢复运行后使用可预期的公网地址。你将操作 EC2 实例,对比停止与运行状态,关联 Elastic IP,并在再次停止和启动后检查应用。

你应已了解 EC2 启动、SSH 和 User Data。这个全新环境提供自己的镜像、网络、密钥对和启动脚本。服务器由你创建并操作。

认证备考关联

实例操作和公网地址管理对应 AWS Certified Cloud Practitioner CLF-C02 考试领域 3 中任务 3.3 和 3.5 的计算与网络概念。

启动待维护服务器

本步骤将启动应用服务器,并检查初始状态和地址。

首先进入项目目录:

cd /home/labex/project

加载预置镜像、子网和安全组的 ID:

source launch.env

预置启动脚本会配置报表应用的问候语。使用前先查看它:

cat lifecycle-user-data.sh

找到消息 Lifecycle server。与上一实验一样,--user-data file://... 会读取 Bash 脚本,并在实例启动时传入。创建一个名为 lifecycle-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 \
  --user-data file://lifecycle-user-data.sh \
  --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=lifecycle-server}]'

通过名称标签查询实例 ID,并保存供后续操作使用:

INSTANCE_ID=$(aws ec2 \
  describe-instances \
  --filters Name=tag:Name,Values=lifecycle-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;如果仍为 pending,稍等后再次查询。留意输出中的私有和公网 IPv4 地址,维护后需要对比。

打开 AWS View,点击 Refresh resources。在 Application requests 下选择 lifecycle-server,再点击 Check application。修改实例状态之前,确认 HTTP 200 和 Lifecycle server。

停止服务器进行维护

本步骤将停止实例,并确认它无法处理应用请求。

stopped(已停止)实例已关机,但可以再次启动。terminated(已终止)实例已被永久移除。对以 EBS 为根存储的实例,停止会保留根卷;停止期间实例上的应用不可用。实例生命周期官方指南 解释了这些状态的区别。

停止你的应用实例:

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

等待 stopped。waiter 会轮询状态,条件满足后不输出内容并返回:

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

再次检查状态和地址:

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

确认状态为 stopped。私有 IPv4 地址保留,自动分配的公网 IPv4 地址会释放。再次启动后,需要使用当时的公网地址。

刷新 AWS View,确认 stopped,且该实例不再出现在运行中应用的选择列表里。维护期间服务器不可用,即使实例记录和根存储仍存在。

使用 Elastic IP 保留公网地址

本步骤将启动服务器,关联 Elastic IP,并在另一次停止/启动后确认公网地址仍保持关联。

启动现有实例:

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

等待 running:

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

检查地址:

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

实例 ID 和私有 IPv4 地址保持不变。自动分配的公网地址在停止/启动后会变化。刷新 AWS View,再次检查应用;它仍应返回 Lifecycle server。

Elastic IP(弹性 IP)是分配给账户的公网 IPv4 地址,直到你将它释放。分配操作保留地址,关联操作将地址连接到实例或网络接口。它可以在停止/启动后提供稳定地址,详见 Elastic IP 官方指南。

为 VPC 使用分配一个 Elastic IP,并保存分配 ID:

ALLOCATION_ID=$(aws ec2 \
  allocate-address \
  --domain vpc \
  --query 'AllocationId' \
  --output text)

将这项分配关联到实例。保存返回的关联 ID,供清理使用:

ASSOCIATION_ID=$(aws ec2 \
  associate-address \
  --allocation-id "$ALLOCATION_ID" \
  --instance-id "$INSTANCE_ID" \
  --query 'AssociationId' \
  --output text)

检查地址及其关联的实例:

aws ec2 \
  describe-addresses \
  --allocation-ids "$ALLOCATION_ID" \
  --query 'Addresses[].{PublicIPv4:PublicIp,Allocation:AllocationId,Instance:InstanceId}'

记住 Elastic IP。它会替代实例自动分配的公网 IPv4 地址。刷新 AWS View 并检查应用,确认新地址仍能访问同一服务器。

现在执行另一次维护循环:

aws ec2 \
  stop-instances \
  --instance-ids "$INSTANCE_ID"
aws ec2 \
  wait instance-stopped \
  --instance-ids "$INSTANCE_ID"
aws ec2 \
  start-instances \
  --instance-ids "$INSTANCE_ID"
aws ec2 \
  wait instance-running \
  --instance-ids "$INSTANCE_ID"

再次检查实例:

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

确认公网地址仍是刚才记录的 Elastic IP。刷新 AWS View,点击 Check application。HTTP 200 和 Lifecycle server 证明服务器在维护后通过保留的地址处理请求。

释放地址并终止服务器

本步骤将释放已分配的地址,并永久移除应用实例。

解除关联会移除地址与实例的连接,但不会释放账户中的地址。先使用保存的关联 ID 解除关联:

aws ec2 \
  disassociate-address \
  --association-id "$ASSOCIATION_ID"

然后释放地址分配:

aws ec2 \
  release-address \
  --allocation-id "$ALLOCATION_ID"

在 AWS 中,已分配的公网 IPv4 地址仍属于计费资源,即使实例处于停止状态。不再需要地址时,应将其释放作为资源清理的一部分。

终止服务器:

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

等待终止完成:

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

检查实例的最终状态:

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

确认 terminated,再列出剩余的 Elastic IP 分配:

aws ec2 \
  describe-addresses \
  --query 'Addresses[].{Allocation:AllocationId,PublicIPv4:PublicIp}'

结果应为空列表 []。刷新 AWS View,确认服务器不再是运行中的请求目标。保留预置网络和密钥对。

总结

你停止并启动了 EC2 应用服务器,观察地址变化,并关联了 Elastic IP。在另一轮维护之后,你验证了通过保留地址访问应用的结果。最后释放地址分配并终止服务器,确认两类资源均已清理。