做好准备向 Auto Scaling 组添加生命周期钩子 - Amazon A EC2 uto Scaling
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

做好准备向 Auto Scaling 组添加生命周期钩子

在向 Auto Scaling 组添加生命周期钩子之前,请确保正确用户数据脚本或通知目标。

  • 要在实例启动时运行用户数据脚本以对实例执行自定义操作,无需配置通知目标。但是,您必须已创建指定用户数据脚本并将其与 Auto Scaling 组关联的启动模板或启动配置。有关用户数据脚本的更多信息,请参阅《Amazon EC2 用户指南》中的启动时在 Linux 实例上运行命令

  • 要在生命周期操作完成时向 Amazon EC2 Auto Scaling 发出信号,则必须向该脚本添加 CompleteLifecycleAction API 调用,并且您必须使用允许 Auto Scaling 实例调用此 API 的策略手动创建 IAM 角色。您的启动模板或启动配置必须使用在启动时附加到 Amazon EC2 实例的 IAM 实例配置文件指定此角色。有关更多信息,请参阅在自动扩缩组中完成生命周期操作IAM在 Amazon EC2 实例上运行的应用程序的角色

  • 要使用 Lambda 之类的服务执行自定义操作,您必须首先创建一条 EventBridge 规则并将某个 Lambda 函数指定为该规则的目标。有关更多信息,请参阅 为生命周期通知配置通知目标

  • 要允许 Lambda 在生命周期操作完成时向 Amazon EC2 Auto Scaling 发出信号,您必须向函数代码添加 CompleteLifecycleAction API 调用。您还必须将 IAM policy 附加到函数的执行角色,以授予 Lambda 完成生命周期操作的权限。有关更多信息,请参阅 教程:配置调用 Lambda 函数的生命周期钩子

  • 要使用 Amazon SNS 或 Amazon SQS 之类的服务执行自定义操作,您必须已创建 SNS 主题或 SQS 队列并准备好其 Amazon Resource Name (ARN)。您还必须已创建允许 Amazon EC2 Auto Scaling 访问您的 SNS 主题或 SQS 目标的 IAM 角色,并已准备好其 ARN。有关更多信息,请参阅 为生命周期通知配置通知目标

    注意

    默认情况下,当您在控制台中添加生命周期钩子时,Amazon EC2 Auto Scaling 会向 Amazon EventBridge 发送生命周期事件通知。建议的最佳实践是使用 EventBridge 或用户数据脚本。要创建直接向 Amazon SNS 或 Amazon SQS 发送通知的生命周期钩子,请使用 Amazon CLI、Amazon CloudFormation 或开发工具包来添加生命周期钩子。

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

您可以向 Auto Scaling 组添加生命周期钩子,以便在实例进入等待状态时执行自定义操作。您可以选择目标服务,以根据您的首选开发方法执行这些操作。

第一种方法使用 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 为您提供了更多目标服务选择,使您可以使用无服务器架构更轻松地处理事件。

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

请记住,如果您的启动模板或启动配置中有在实例启动时配置实例的用户数据脚本,则无需接收通知即可对实例执行自定义操作。

重要

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

使用 EventBridge 将通知路由到 Lambda

您可以将 EventBridge 规则配置为在实例进入等待状态时调用 Lambda 函数。Amazon EC2 Auto Scaling 将向 EventBridge 发送关于正在启动或终止的实例的生命周期事件通知,以及可用于控制生命周期操作的令牌。有关这些事件的示例,请参阅 Amazon EC2 Auto Scaling 事件参考

注意

在使用 Amazon Web Services Management Console 创建事件规则时,控制台会自动添加所需的 IAM 权限以便向 EventBridge 授予调用 Lambda 函数所需的权限。如果您使用 Amazon CLI 创建事件规则,则需要明确授予此权限。

要详细了解如何在 EventBridge 控制台中创建事件规则,请参阅《Amazon EventBridge 用户指南》中的创建对事件作出反应的 Amazon EventBridge 规则

- 或者 -

有关面向控制台用户的入门教程,请参阅教程:配置调用 Lambda 函数的生命周期钩子。此教程演示了如何创建可侦听启动事件并将其写入 CloudWatch Logs 日志的简单 Lambda 函数。

创建调用 Lambda 函数的 EventBridge 规则
  1. 通过使用 Lambda 控制台创建 Lambda 函数,并记下其 Amazon Resource Name (ARN)。例如,arn:aws:lambda:region:123456789012:function:my-function。您需要 ARN 来创建 EventBridge 目标。有关更多信息,请参阅 Amazon Lambda 开发人员指南中的 Lambda 入门

  2. 要创建匹配实例创建事件的规则,请使用以下 put-rule 命令。

    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" ], "detail": { "AutoScalingGroupName": [ "my-asg" ] } }

    如果该命令成功运行,EventBridge 将使用规则的 ARN 作出响应。记下此 ARN。您需要在第 4 步中输入此信息。

    要创建与其他事件匹配的规则,请修改事件模式。有关更多信息,请参阅 使用 EventBridge 处理 Auto Scaling 事件

  3. 要指定要用作规则目标的 Lambda 函数,请使用以下 put-targets 命令。

    aws events put-targets --rule my-rule --targets Id=1,Arn=arn:aws:lambda:region:123456789012:function:my-function

    在上述命令中,my-rule 是您在第 2 步中为规则指定的名称,Arn 参数的值是您在第 1 步中创建的函数的 ARN。

  4. 要添加允许规则调用您的 Lambda 函数的权限,请使用以下 Lambda add-permission 命令。此命令信任 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

    在上述命令中:

    • my-function 是要将规则用作目标的 Lambda 函数的名称。

    • my-unique-id 是您定义的唯一标识符,用来描述 Lambda 函数策略中的语句。

    • source-arn 是 EventBridge 规则的 ARN。

    如果命令成功运行,则您将收到类似于以下内容的输出:

    { "Statement": "{\"Sid\":\"my-unique-id\", \"Effect\":\"Allow\", \"Principal\":{\"Service\":\"events.amazonaws.com\"}, \"Action\":\"lambda:InvokeFunction\", \"Resource\":\"arn:aws:lambda:us-west-2:123456789012:function:my-function\", \"Condition\": {\"ArnLike\": {\"AWS:SourceArn\": \"arn:aws:events:us-west-2:123456789012:rule/my-rule\"}}}" }

    Statement 值是已添加到 Lambda 函数策略的语句的 JSON 字符串版本。

  5. 在遵循以上说明操作后,继续向自动扩缩组添加生命周期挂钩 作为下一步。

使用 Amazon SNS 接收通知

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

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

    aws sns create-topic --name my-sns-topic
  2. 记录主题 Amazon Resource Name (ARN),例如 arn:aws:sns:region:123456789012:my-sns-topic。您需要它来创建生命周期钩子。

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

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

    1. 通过 https://console.aws.amazon.com/iam/ 打开 IAM 控制台。

    2. 在左侧的导航窗格中,选择角色

    3. 选择 Create role(创建角色)。

    4. 对于选择可信实体,选择 Amazon 服务

    5. 对于您的使用案例,在其他 Amazon 服务的使用案例下,选择 EC2 Auto Scaling,然后选择 EC2 Auto Scaling 通知访问权限

    6. 选择 Next(下一步)两次,以前往 Name, review, and create(命名、检查和创建)页面。

    7. 对于 Role name(角色名称),输入角色的名称(例如 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 Simple Queue Service 开发人员指南中的 Amazon SQS 入门

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

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

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

    1. 通过 https://console.aws.amazon.com/iam/ 打开 IAM 控制台。

    2. 在左侧的导航窗格中,选择角色

    3. 选择 Create role(创建角色)。

    4. 对于选择可信实体,选择 Amazon 服务

    5. 对于您的使用案例,在其他 Amazon 服务的使用案例下,选择 EC2 Auto Scaling,然后选择 EC2 Auto Scaling 通知访问权限

    6. 选择 Next(下一步)两次,以前往 Name, review, and create(命名、检查和创建)页面。

    7. 对于 Role name(角色名称),输入角色的名称(例如 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 账户 ID。

  • 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 的事件示例,请参阅 Amazon EC2 Auto Scaling 事件参考