介绍
团队希望在维护期间停止报表服务器,并在恢复运行后使用可预期的公网地址。你将操作 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。在另一轮维护之后,你验证了通过保留地址访问应用的结果。最后释放地址分配并终止服务器,确认两类资源均已清理。



