Knowledge Center Monthly Newsletter - March 2025
Stay up to date with the latest from the Knowledge Center. See all new and updated Knowledge Center articles published in the last month and re:Post’s top contributors.
如何延迟终止运行状况不佳的 Amazon EC2 实例,以便我能排查问题?
我的 Amazon Elastic Compute Cloud(Amazon EC2)实例运行状况不佳,在我确定问题原因之前已终止。
简短描述
要在终止前对运行状况不佳的 EC2 实例进行故障排除,请添加一个 Amazon EC2 Auto Scaling 生命周期挂钩,以将实例的状态从 Terminating 移至 Terminating:Wait。
默认情况下,实例在 Terminating:Wait 状态下保持 3600 秒或 1 小时。要增加此时间,请在 put-lifecycle-hook API 调用中使用 heartbeat-timeout 参数。您可以将实例保持在 Terminating:Wait 状态的最长时间为 48 小时或心跳超时 100 次,以较小者为准。
解决方法
使用 AWS 命令行界面(AWS CLI)配置生命周期挂钩。
**注意:**如果在运行 AWS CLI 命令时收到错误,请参阅 Troubleshoot AWS CLI errors。此外,确保您使用的是最新版本的 AWS CLI。
创建 Amazon SNS 主题
要创建 Amazon Simple Notification Service(Amazon SNS)主题,请完成以下步骤:
-
创建一个 SNS 主题,EC2 自动扩缩组在其中发送生命周期通知。以下示例会运行 create-topic 命令来创建 ASNotifications 主题:
$ aws sns create-topic --name ASNotifications
输出会返回类似于以下内容的 ARN:
"TopicArn": "arn:aws:sns:us-west-2:123456789012:ASNotifications"
-
为该主题创建订阅。您必须具有一个订阅,才能获得延长待处理状态的心跳超时或完成生命周期操作所需的 LifecycleActionToken。以下示例运行 subscribe 命令来创建使用电子邮件协议 SMTP 且端点电子邮件地址为 user@amazon.com 的订阅:
$ aws sns subscribe --topic-arn arn:aws:sns:us-west-2:123456789012:ASNotifications --protocol email --notification-endpoint user@amazon.com
配置 IAM 权限
配置 AWS Identity and Access Management(IAM)角色,向 EC2 自动扩缩组服务授予发送到 SNS 主题的权限。要完成此任务,请创建一个包含相应策略的文本文件。然后,在 create-role 命令中引用该文件。
-
使用文本编辑器(如 vi)来创建文本文件:
$ sudo vi assume-role.txt
-
在文本文件中输入下面的信息,然后保存该文件:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "autoscaling.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
-
运行 aws iam create-role 命令,从保存到 assume-role.txt 的策略创建 AS-Lifecycle-Hook-Role IAM 角色:
$ aws iam create-role --role-name AS-Lifecycle-Hook-Role --assume-role-policy-document file://assume-role.txt
输出包含该角色的 ARN。注意 IAM 角色和 SNS 主题的 ARN。
-
为角色添加权限,以允许 EC2 Auto Scaling 在发生生命周期挂钩事件时发送 SNS 通知。以下示例运行 attach-role-policy 命令来将 AutoScalingNotificationAccessRole AWS 托管策略附加到 AS-Lifecycle-Hook-Role IAM 角色:
$ aws iam attach-role-policy --role-name AS-Lifecycle-Hook-Role --policy-arn arn:aws:iam::aws:policy/service-role/AutoScalingNotificationAccessRole
上述托管策略授予以下权限:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Resource": "*", "Action": [ "sqs:SendMessage", "sqs:GetQueueUrl", "sns:Publish" ] } ] }
重要事项: AutoScalingNotificationAccessRole 托管策略允许 EC2 Auto Scaling 调用所有 SNS 主题和队列。要限制 EC2 Auto Scaling 对特定 SNS 主题或队列的访问,请使用以下示例策略。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Resource": "arn:aws:sns:us-west-2:123456789012:ASNotifications", "Action": [ "sqs:SendMessage", "sqs:GetQueueUrl", "sns:Publish" ] } ] }
配置生命周期挂钩
接下来,运行 put-lifecycle-hook 命令来配置生命周期挂钩:
aws autoscaling put-lifecycle-hook --lifecycle-hook-name AStroubleshoot --auto-scaling-group-name MyASGroup --lifecycle-transition autoscaling:EC2_INSTANCE_TERMINATING --notification-target-arn arn:aws:sns:us-west-2:123456789012:ASNotifications --role-arn arn:aws:iam::123456789012:role/AS-Lifecycle-Hook-Role
注意: 将示例值替换为您的 EC2 自动扩缩组名称、SNS 目标 ARN 和 IAM 角色 ARN。
put-lifecycle-hook 命令完成了以下功能:
- 为生命周期挂钩命名(AStroubleshoot)
- 识别与生命周期挂钩关联的 EC2 自动扩缩组(MyASGroup)
- 为实例终止生命周期阶段(EC2_INSTANCE_TERMINATING)配置挂钩
- 指定 SNS 主题的 ARN(arn:aws:sns:us-west-2:123456789012:ASNotifications)
- 指定 IAM 角色的 ARN(arn:aws:iam::123456789012:role/AS-Lifecycle-Hook-Role)
测试生命周期挂钩
要测试生命周期挂钩,首先选择一个实例。然后,运行 terminate-instance-in-auto-scaling group 命令来强制终止该实例。在实例移至 Terminating:Wait 状态后,运行 record-lifecycle-action-heartbeat 命令以使实例保持此状态。或者,运行 complete-lifecycle-action 命令以完成终止:
aws autoscaling complete-lifecycle-action --lifecycle-hook-name my-lifecycle-hook --auto-scaling-group-name MyASGroup --lifecycle-action-result CONTINUE --instance-id i-0e7380909ffaab747
相关信息

相关内容
- AWS 官方已更新 3 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 3 年前