为生命周期挂钩配置通知目标 - Amazon EC2 Auto Scaling
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

为生命周期挂钩配置通知目标

您可以向 Auto Scaling 组添加生命周期挂钩,以便在实例进入等待状态时执行自定义操作。您可以配置通知目标,以使用各种 Amazon Web Services 执行这些操作,具体取决于您的首选开发方法。

第一种方法使用 Amazon EventBridge 调用执行所需操作的 Lambda 函数。第二种方法是创建 Amazon Simple Notification Service (Amazon SNS) 主题,向其发布通知。客户端可以订阅 SNS 主题并使用支持的协议接收已发布的消息。最后一种方法是使用 Amazon Simple Queue Service (Amazon SQS),该服务需要工作线程节点轮询队列的消息传送系统。

作为最佳实践,我们建议您使用 EventBridge。发送到 Amazon SNS 和 Amazon SQS 的通知包含的信息与 Amazon EC2 Auto Scaling 发送到 EventBridge 的通知相同。在 EventBridge 之前,标准做法是向 SNS 或 SQS 发送通知,并将其他服务与 SNS 或 SQS 集成以执行编程操作。如今,EventBridge 为您提供了更多选择,可以选择哪些服务,并使使用无服务器架构更轻松地处理事件。

以下过程介绍了如何设置通知目标。

请记住,如果您拥有在实例启动时配置实例的用户数据脚本或 cloud-init 指令,则无需在生命周期操作开始时接收通知。

重要

与生命周期挂钩一起使用的 EventBridge 规则、Lambda 函数、Amazon SNS 主题和 Amazon SQS 队列必须始终位于您创建 Auto Scaling 组的同一个区域。

使用 EventBridge 将通知路由到 Lambda

您可以使用 EventBridge 执行生命周期操作时调用 Lambda 函数。有关发生生命周期操作时发出的 EventBridge 事件的信息,请参阅Auto Scaling 事件。有关介绍性教程风格的指南,该指南介绍了如何创建一个简单的 Lambda 函数来侦听启动事件并将它们写入 CloudWatch Logs,请参阅教程:配置调用 Lambda 函数的生命周期挂钩

使用 Lambda 函数作为 EventBridge 规则的目标

  1. 使用 Lambda 函数Lambda 控制台并记下其 Amazon 资源名称 (ARN)。例如:arn:aws:lambda:region:123456789012:function:my-function。您需要 ARN 来创建 EventBridge 梁目标。

    有关更多信息,请参阅 。Lambda 入门中的Amazon Lambda开发人员指南

  2. 使用以下命令创建与生命周期操作匹配的 EventBridge 规则推出规则命令。

    注意

    当您使用Amazon Web Services Management Console创建事件规则时,控制台会自动添加所需的 IAM 权限以便向 EventBridge 授予调用 Lambda 函数所需的 IAM 权限。如果您使用 Amazon CLI 创建事件规则,则需要明确授予此权限。有关使用控制台创建事件规则的帮助,请参阅教程:配置调用 Lambda 函数的生命周期挂钩

    aws events put-rule --name my-rule --event-pattern file://pattern.json --state ENABLED

    以下示例显示pattern.json以获取实例启动生命周期操作的。

    { "source": [ "aws.autoscaling" ], "detail-type": [ "EC2 Instance-launch Lifecycle Action" ] }

    以下示例显示pattern.json实例终止生命周期操作的。

    { "source": [ "aws.autoscaling" ], "detail-type": [ "EC2 Instance-terminate Lifecycle Action" ] }
  3. 创建一个在生命周期操作发生时调用 Lambda 函数的目标,使用以下投射目标命令。

    aws events put-targets --rule my-rule --targets Id=1,Arn=arn:aws:lambda:region:123456789012:function:my-function
  4. 授予调用 Lambda 函数的规则权限,以便使用以下内容调用 Lambda 函数添加权限命令。此命令信任 EventBridge 服务主体 (events.amazonaws.com),并将权限范围划定为指定规则。

    aws lambda add-permission --function-name my-function --statement-id my-unique-id \ --action 'lambda:InvokeFunction' --principal events.amazonaws.com --source-arn arn:aws:events:region:123456789012:rule/my-rule
  5. 在遵循以上说明操作后,继续添加生命周期挂钩 作为下一步。

使用 Amazon SNS 接收通知

您可以使用 Amazon SNS 设置通知目标(SNS 主题),以便在生命周期操作开始时接收通知。然后,Amazon SNS 将通知发送给订阅的收件人。确认订阅前,向主题发布的通知不会发送给收件人。

使用 Amazon SNS 设置通知

  1. 使用 Amazon SNS 主题Amazon SNS 控制台或以下创建主题命令。确保该主题与您使用的 Auto Scaling 组位于同一区域。有关更多信息,请参阅 。Amazon SNS 入门中的Amazon Simple Notification Service 开发人员指南

    aws sns create-topic --name my-sns-topic
  2. 请记下主题的 Amazon 资源名称 (ARN),例如,arn:aws:sns:region:123456789012:my-sns-topic。您需要它来创建生命周期挂钩。

  3. 创建 IAM 服务角色,以授予 Amazon EC2 Auto Scaling 访问您的 Amazon SNS 通知目标的权限。

    向 Amazon EC2 Auto Scaling 授予您 SNS 主题的访问权限

    1. 通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/

    2. 在导航窗格上,选择角色创建角色

    3. Select type of trusted entity (选择受信任实体的类型) 下,选择 Amazon service ( 服务)

    4. 选择将使用此角色的服务下,选择 EC2 Auto Scaling

    5. 选择您的使用案例下,选择 EC2 Auto Scaling Notification Access (EC2 Auto Scaling 通知访问),然后选择 Next:Permissions (下一步:权限)

    6. 选择 Next:Tags (下一步: 标签)。(可选)您可以通过以键值对的形式附加标签来向角色添加元数据。然后选择 Next:Review (下一步:审核)

    7. Review (审核) 页面上,输入角色的名称(例如,my-notification-role),然后选择 Create role (创建角色)

    8. Roles (角色) 页面中,选择刚刚创建的角色以打开 Summary (摘要) 页面。记录角色 ARN。例如:arn:aws:iam::123456789012:role/my-notification-role。您需要它来创建生命周期挂钩。

  4. 在遵循以上说明操作后,继续添加生命周期挂钩 ()Amazon CLI) 作为下一步。

使用 Amazon SQS 接收通知

您可以使用 Amazon SQS 设置通知目标以在生命周期操作发生时接收消息。然后,工作节点必须轮询 SQS 队列以对这些通知执行操作。

重要

FIFO 队列与生命周期挂钩不兼容。

使用 Amazon SQS 设置通知

  1. 使用命令创建 Amazon SQS 队列Amazon SQS 控制台。确保队列与您正在使用的 Auto Scaling 组位于同一个区域。有关更多信息,请参阅 。Amazon SQS 入门中的Amazon Simple Queue Service 开发者指南

  2. 记下队列 ARN,例如arn:aws:sqs:region:123456789012:my-sqs-queue。您需要它来创建生命周期挂钩。

  3. 创建 IAM 服务角色,以授予 Amazon EC2 Auto Scaling 访问您的 Amazon SQS 通知目标的权限。

    向 Amazon EC2 Auto Scaling 授予您 SQS 队列的访问权限

    1. 通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/

    2. 在导航窗格上,选择角色创建角色

    3. Select type of trusted entity (选择受信任实体的类型) 下,选择 Amazon service ( 服务)

    4. 选择将使用此角色的服务下,选择 EC2 Auto Scaling

    5. 选择您的使用案例下,选择 EC2 Auto Scaling Notification Access (EC2 Auto Scaling 通知访问),然后选择 Next:Permissions (下一步:权限)

    6. 选择 Next:Tags (下一步: 标签)。(可选)您可以通过以键值对的形式附加标签来向角色添加元数据。然后选择 Next:Review (下一步:审核)

    7. Review (审核) 页面上,输入角色的名称(例如,my-notification-role),然后选择 Create role (创建角色)

    8. Roles (角色) 页面中,选择刚刚创建的角色以打开 Summary (摘要) 页面。记录角色 ARN。例如:arn:aws:iam::123456789012:role/my-notification-role。您需要它来创建生命周期挂钩。

  4. 在遵循以上说明操作后,继续添加生命周期挂钩 ()Amazon CLI) 作为下一步。

Amazon SNS 和 Amazon SQS 的通知消息示例

当实例处于等待状态时,将向 Amazon SNS 或 Amazon SQS 通知目标发布消息。消息包含以下信息:

  • LifecycleActionToken— 生命周期操作令牌。

  • AccountId— Amazon Web Services 账户编号。

  • AutoScalingGroupName— Auto Scaling 组的名称。

  • LifecycleHookName— 生命周期挂钩的名称。

  • EC2InstanceId— EC2 实例的 ID。

  • LifecycleTransition— 生命周期挂钩类型。

  • NotificationMetadata— 通知元数据。

以下是通知消息示例。

Service: AWS Auto Scaling Time: 2021-01-19T00:36:26.533Z RequestId: 18b2ec17-3e9b-4c15-8024-ff2e8ce8786a LifecycleActionToken: 71514b9d-6a40-4b26-8523-05e7ee35fa40 AccountId: 123456789012 AutoScalingGroupName: my-asg LifecycleHookName: my-hook EC2InstanceId: i-0598c7d356eba48d7 LifecycleTransition: autoscaling:EC2_INSTANCE_LAUNCHING NotificationMetadata: hook message metadata

测试通知消息示例

首次添加生命周期挂钩时,测试通知消息将发布到通知目标。以下是测试通知消息示例。

Service: AWS Auto Scaling Time: 2021-01-19T00:35:52.359Z RequestId: 18b2ec17-3e9b-4c15-8024-ff2e8ce8786a Event: autoscaling:TEST_NOTIFICATION AccountId: 123456789012 AutoScalingGroupName: my-asg AutoScalingGroupARN: arn:aws:autoscaling:us-west-2:123456789012:autoScalingGroup:042cba90-ad2f-431c-9b4d-6d9055bcc9fb:autoScalingGroupName/my-asg
注意

有关从 Amazon EC2 Auto Scaling 到 EventBridge 的事件示例,请参阅Auto Scaling 事件