

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

# 做好准备向 Auto Scaling 组添加生命周期钩子
<a name="prepare-for-lifecycle-notifications"></a>

在向 Auto Scaling 组添加生命周期钩子之前，请确保正确用户数据脚本或通知目标。
+ 要在实例启动时运行用户数据脚本以对实例执行自定义操作，无需配置通知目标。但是，您必须已创建指定用户数据脚本并将其与 Auto Scaling 组关联的启动模板或启动配置。有关用户数据脚本的更多信息，请参阅《Amazon EC2 用户指南》**中的[启动时在 Linux 实例上运行命令](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html)。
+ 要在生命周期操作完成时向 Amazon EC2 Auto Scaling 发送信号，您必须将 [CompleteLifecycleAction](https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_CompleteLifecycleAction.html)API 调用添加到脚本中，并且必须手动创建一个 IAM 角色，其策略允许 Auto Scaling 实例调用此 API。您的启动模板或启动配置必须使用在启动时附加到 Amazon EC2 实例的 IAM 实例配置文件指定此角色。有关更多信息，请参阅[在自动扩缩组中完成生命周期操作](completing-lifecycle-hooks.md)和[在 Amazon EC2 实例上运行的应用程序的 IAM 角色](us-iam-role.md)。
+ 要允许 Lambda 在生命周期操作完成时向 Amazon EC2 Auto Scaling 发出信号，您必须在函数代码中添加 [CompleteLifecycleAction](https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_CompleteLifecycleAction.html)API 调用。您还必须将 IAM policy 附加到函数的执行角色，以授予 Lambda 完成生命周期操作的权限。有关更多信息，请参阅 [教程：配置调用 Lambda 函数的生命周期钩子](tutorial-lifecycle-hook-lambda.md)。
+ 要使用 Amazon SNS 或 Amazon SQS 之类的服务执行自定义操作，您必须已创建 SNS 主题或 SQS 队列并准备好其 Amazon Resource Name (ARN)。您还必须已创建允许 Amazon EC2 Auto Scaling 访问您的 SNS 主题或 SQS 目标的 IAM 角色，并已准备好其 ARN。有关更多信息，请参阅 [为生命周期通知配置通知目标](#lifecycle-hook-notification-target)。
**注意**  
默认情况下，当您在控制台中添加生命周期挂钩时，Amazon EC2 Auto Scaling 会向亚马逊发送生命周期事件通知 EventBridge。建议使用 EventBridge 或用户数据脚本。要创建直接向 Amazon SNS、Amazon SQS 或发送通知的生命周期挂钩，请使用 AWS CLI、 AWS Lambda或软件开发工具包添加生命周期挂钩。 AWS CloudFormation

## 为生命周期通知配置通知目标
<a name="lifecycle-hook-notification-target"></a>

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

实现生命周期挂钩的通知目标有四种不同的方法：
+ **Amazon EventBridge** — 接收通知并执行您想要的操作。
+ **Amazon Simple Notiﬁcation Service（Amazon SNS）**：创建发布通知的主题。客户端可以订阅 SNS 主题并使用支持的协议接收已发布的消息。
+ **Amazon Simple Queue Service（Amazon** SQS）：通过轮询模型交换消息。
+ **AWS Lambda**：调用执行所需操作的 Lambda 函数。

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

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

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

**Topics**
+ [使用将通知发送到 Lambda EventBridge](#cloudwatch-events-notification)
+ [使用 Amazon SNS 接收通知](#sns-notifications)
+ [使用 Amazon SQS 接收通知](#sqs-notifications)
+ [将通知 AWS Lambda 直接发送到](#lambda-notification)
+ [测试通知消息示例](#notification-message-example)

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

### 使用将通知发送到 Lambda EventBridge
<a name="cloudwatch-events-notification"></a>

您可以配置 EventBridge 规则，以便在实例进入等待状态时调用 Lambda 函数。Amazon EC2 Auto Scaling 会向其发送 EventBridge 有关正在启动或终止的实例的生命周期事件通知，以及一个可用于控制生命周期操作的令牌。有关这些事件的示例，请参阅 [Amazon EC2 Auto Scaling 事件参考](ec2-auto-scaling-event-reference.md)。

**注意**  
当您使用创建事件规则时，控制台会自动添加授予 EventBridge 调用 Lambda 函数的权限所必需的 IAM 权限。 AWS 管理控制台 如果您使用 AWS CLI创建事件规则，则需要明确授予此权限。  
有关如何在 EventBridge 控制台中创建事件规则的信息，请参阅《[亚马逊* EventBridge 用户指南》中的创建对事件做出反应的 Amazon EventBridge* 规则](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-create-rule.html)。  
- 或者 -   
有关面向控制台用户的入门教程，请参阅[教程：配置调用 Lambda 函数的生命周期钩子](tutorial-lifecycle-hook-lambda.md)。本教程向您展示如何创建一个简单的 Lambda 函数，该函数用于监听启动事件并将其写入日志中。 CloudWatch 

**创建调用 Lambda 函数的 EventBridge 规则**

1. 通过使用 [Lambda 控制台](https://console.aws.amazon.com/lambda/home#/functions)创建 Lambda 函数，并记下其 Amazon Resource Name (ARN)。例如 `arn:aws:lambda:region:123456789012:function:my-function`。您需要使用 ARN 来创建目标。 EventBridge 有关更多信息，请参阅 *AWS Lambda 开发人员指南*中的 [Lambda 入门](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html)。

1. 要创建匹配实例创建事件的规则，请使用以下 [put-rule](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/events/put-rule.html) 命令。

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

   以下示例显示了实例启动生命周期操作的 `pattern.json`。将中的**italics**文本替换为您的 Auto Scaling 组的名称。

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

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

   要创建与其他事件匹配的规则，请修改事件模式。有关更多信息，请参阅 [用于处理 EventBridge Auto Scaling 事件](automating-ec2-auto-scaling-with-eventbridge.md)。

1. 要指定要用作规则目标的 Lambda 函数，请使用以下 [put-targets](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/events/put-targets.html) 命令。

   ```
   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。

1. 要添加允许规则调用您的 Lambda 函数的权限，请使用以下 Lambda [add-permission](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/add-permission.html) 命令。此命令将 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`是规则的 ARN。 EventBridge 

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

   ```
   {
     "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 字符串版本。

1. 在遵循以上说明操作后，继续[向自动扩缩组添加生命周期挂钩](adding-lifecycle-hooks.md) 作为下一步。

### 使用 Amazon SNS 接收通知
<a name="sns-notifications"></a>

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

**使用 Amazon SNS 设置通知**

1. 通过使用 [Amazon SNS 控制台](https://console.aws.amazon.com/sns/)或以下 [create-topic](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sns/create-topic.html) 命令创建 Amazon SNS 主题。确保该主题与您使用的 Auto Scaling 组位于同一区域。有关更多信息，请参阅 *Amazon Simple Notification Service 开发人员指南*中的 [Amazon SNS 入门](https://docs.aws.amazon.com/sns/latest/dg/sns-getting-started.html)。

   ```
   aws sns create-topic --name my-sns-topic
   ```

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

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

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

   1. 使用 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

   1. 在左侧的导航窗格中，选择**角色**。

   1. 选择**创建角色**。

   1. 对于**选择可信实体**，选择 **AWS 服务**。

   1. 对于您的使用案例，在**其他 AWS 服务的使用案例**下，选择 **EC2 Auto Scaling**，然后选择 **EC2 Auto Scaling 通知访问权限**。

   1. 选择 **Next**（下一步）两次，以前往 **Name, review, and create**（命名、检查和创建）页面。

   1. 对于 **Role name**（角色名称），输入角色的名称（例如 **my-notification-role**），然后选择 **Create role**（创建角色）。

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

1. 在遵循以上说明操作后，继续[添加生命周期钩子 (AWS CLI)](adding-lifecycle-hooks.md#adding-lifecycle-hooks-aws-cli) 作为下一步。

### 使用 Amazon SQS 接收通知
<a name="sqs-notifications"></a>

您可以使用 Amazon SQS 设置通知目标以便在生命周期操作开始时接收消息。然后，队列使用者必须轮询 SQS 队列，以便对这些通知执行操作。

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

**使用 Amazon SQS 设置通知**

1. 使用 [Amazon SQS 控制台](https://console.aws.amazon.com/sqs/)创建 Amazon SQS 队列。确保队列与您正在使用的 Auto Scaling 组位于同一个区域。有关更多信息，请参阅 *Amazon Simple Queue Service 开发人员指南*中的 [Amazon SQS 入门](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-getting-started.html)。

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

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

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

   1. 使用 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

   1. 在左侧的导航窗格中，选择**角色**。

   1. 选择**创建角色**。

   1. 对于**选择可信实体**，选择 **AWS 服务**。

   1. 对于您的使用案例，在**其他 AWS 服务的使用案例**下，选择 **EC2 Auto Scaling**，然后选择 **EC2 Auto Scaling 通知访问权限**。

   1. 选择 **Next**（下一步）两次，以前往 **Name, review, and create**（命名、检查和创建）页面。

   1. 对于 **Role name**（角色名称），输入角色的名称（例如 **my-notification-role**），然后选择 **Create role**（创建角色）。

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

1. 在遵循以上说明操作后，继续[添加生命周期钩子 (AWS CLI)](adding-lifecycle-hooks.md#adding-lifecycle-hooks-aws-cli) 作为下一步。

### 将通知 AWS Lambda 直接发送到
<a name="lambda-notification"></a>

在生命周期操作开始时，可以使用 Lambda 函数作为通知目标。

**将通知 AWS Lambda 直接发送到**

1. 打开 Lambda 控制台的[函数](https://console.aws.amazon.com/lambda/home#/functions)页面。

1. 选择所需的 Lambda 函数。

   若要创建新的 Lambda 函数，请参阅[创建 Lambda 函数](lambda-custom-termination-policy.md#lambda-custom-termination-policy-create-function)

1. 接下来，选择**配置**选项卡，然后选择**权限**。

1. 向下滚动到**基于资源的策略**，然后选择**添加权限**。基于资源的策略用于向在策略中指定的委托人授予调用函数的权限。在这种情况下，委托人将是与 Auto Scaling 组关联的 [Amazon EC2 Auto Scaling 服务关联角色](https://docs.aws.amazon.com/autoscaling/ec2/userguide/autoscaling-service-linked-role.html)。

1. 在**策略语句**部分中，配置您的权限：

   1. 选择 **AWS 账户**。

   1. 适用于**委托人**中，输入调用服务链接角色的 ARN，例如 **arn:aws:iam::<aws-account-id>:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling**。

   1. 在 “**操作”** 中，选择 **lambda: InvokeFunction**。

   1. 对于**声明 ID**，输入唯一的声明 ID，如 **AllowInvokeByAutoScaling**。

   1. 选择**保存**。

1. 在遵循以上说明操作后，继续[添加生命周期钩子 (AWS CLI)](adding-lifecycle-hooks.md#adding-lifecycle-hooks-aws-cli) 作为下一步。

### 测试通知消息示例
<a name="notification-message-example"></a>

本节提供了亚马逊 SNS、亚马逊 SQS 和的通知示例。 AWS Lambda

当实例处于等待状态时，会向 Amazon SNS、Amazon SQS 和通知目标发布一条消息。 AWS Lambda 

消息包含以下信息：
+ `Origin`：EC2 实例的来源。
+ `Destination`：EC2 实例的目的地。
+ `LifecycleActionToken` — 生命周期操作令牌。
+ `AccountId`— AWS 账户 身份证。
+ `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
Origin: EC2
Destination: AutoScalingGroup
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
```

#### 测试通知消息示例
<a name="test-notification-message-example"></a>

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

```
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 事件参考](ec2-auto-scaling-event-reference.md)。