Manju 向您演示如何
延迟 EC2 实例的终止
以便排查故障

Manju_DUB_0518

我的 Amazon EC2 实例标记为不正常,然后变为 Auto Scaling“Terminating (正在终止)”状态,我还没找到问题原因它就终止了。

您可以向 Auto Scaling 组添加生命周期挂钩,从而将实例从 Terminating (正在终止) 状态转变为 Terminating:Wait (正在终止:等待) 状态。此状态允许您在实例终止前访问它们,以便对实例被标记为“unhealthy”的原因进行排查。

默认情况下,实例将保持 Terminating:Wait (正在终止:等待) 状态 3600 秒(1 小时)。要增加此时间,可以在 put-lifecycle-hook API 调用中使用 heartbeat-timeout 参数。您可以将实例保持在 Terminating:Wait (正在终止:等待) 状态的最长时间是 48 小时或检测信号超时的 100 倍(以较小者为准)。

生命周期挂钩只能使用 AWS CLI 和 API 进行配置。下面的步骤介绍生命周期挂钩的配置过程,包括使用 AWS CLI 创建必要的 SNS 主题和 IAM 权限。如果您希望使用控制台管理 IAM 和 SNS,请参阅创建角色(对于 IAM)和创建主题(对于 SNS)。

1.    为 Auto Scaling 创建 SNS 主题,以便将生命周期通知发送到该主题。以下 CLI 示例调用 SNS create-topic 命令创建 SNS 主题 ASNotifications:

$ aws sns create-topic --name ASNotifications

2.    保存返回的 Amazon 资源名称 (ARN)。返回的 ARN 应类似以下内容:

"TopicArn": "arn:aws:sns:us-west-2:123456789012:ASNotifications"

3.    创建 SNS 主题订阅。这是接收 LifecycleActionToken 所必需的;延长待处理状态检测信号超时或完成生命周期操作需要 LifecycleActionToken。以下示例使用 aws sns 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 权限通过创建 IAM 角色进行配置;IAM 角色授予 Auto Scaling 服务向 SNS 主题发送内容的权限。这可以通过创建包含适当策略的文本文件,然后从 aws iam create-role 命令引用此文件来实现。下面列出了具体步骤:

1.    使用文本编辑器(如 vi)创建一个文本文件:

$ sudo vi assume-role.txt

2.    将以下内容粘贴到文本文件中并保存文件。

{
  "Version": "2012-10-17",
  "Statement": [{
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "autoscaling.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

3.    以下示例使用 aws iam create-role 命令从保存到 assume-role.txt 的策略创建 IAM 角色 AS-Lifecycle-Hook-Role

$ aws iam create-role --role-name AS-Lifecycle-Hook-Role --assume-role-policy-document file://assume-role.txt

输出包含角色 ARN。确保保存 IAM 角色ARNSNS 主题

4.    向角色添加权限,以允许 Auto Scaling 在发生生命周期挂钩事件时发送 SNS 通知。以下示例使用 aws iam attach-role-policy 命令将托管策略 AutoScalingNotificationAccessRole 附加到 IAM 角色 AS-Lifecycle-Hook-Role

$ 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"
      ]
    }
  ]
}

正确配置通知和权限后,可以配置生命周期挂钩。以下示例使用 aws autoscaling put-lifecycle-hook 命令配置生命周期挂钩:

aws autoscaling put-lifecycle-hook --lifecycle-hook-name AStroublshoot --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

此命令执行以下任务:

  • 命名生命周期挂钩 (AStroubleshoot)。
  • 标识生命周期挂钩关联的 Auto Scaling 组 (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)。

在环境中运行此命令前,请务必在适当的位置替换您自己的 Auto Scaling 组名称、SNS 目标 ARN 和 IAM 角色 ARN。

要测试生命周期挂钩,请选择一个实例,然后使用 terminate-instance-in-auto-scaling group 终止此实例。这使得 Auto Scaling 终止实例,类似于实例进入“unhealthy”状态后它所采取的操作。待实例转变为 Terminating:Wait (正在终止:等待) 状态后,可以选择让实例保持 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 Support 知识中心

需要帮助? 访问 AWS 支持中心

发布时间:2015 年 8 月 4 日

更新时间:2017 年 8 月 25 日