如何延迟终止运行状况不佳的 Amazon EC2 实例,以便我能排查问题?

2 分钟阅读
0

我的 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)主题,请完成以下步骤:

  1. 创建一个 SNS 主题,EC2 自动扩缩组在其中发送生命周期通知。以下示例会运行 create-topic 命令来创建 ASNotifications 主题:

    $ aws sns create-topic --name ASNotifications

    输出会返回类似于以下内容的 ARN:

    "TopicArn": "arn:aws:sns:us-west-2:123456789012:ASNotifications"
  2. 为该主题创建订阅。您必须具有一个订阅,才能获得延长待处理状态的心跳超时或完成生命周期操作所需的 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 命令中引用该文件。

  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 的策略创建 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。

  4. 为角色添加权限,以允许 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

相关信息

Amazon EC2 Auto Scaling lifecycle hooks

创建向 AWS 服务委派权限的角色

Creating an Amazon SNS topic

AWS 官方
AWS 官方已更新 1 年前