

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

# 向自动扩缩组添加生命周期挂钩
<a name="adding-lifecycle-hooks"></a>

要将 Auto Scaling 实例置于等待状态并对它们执行自定义操作，您可以向 Auto Scaling 组添加生命周期钩子。自定义操作将在实例启动时或其终止之前执行。实例将保持等待状态，直到您完成生命周期操作，或者直到超时时段结束。

从创建 Auto Scaling 组后 AWS 管理控制台，您可以向该组添加一个或多个生命周期挂钩，总共可添加最多 50 个生命周期挂钩。您还可以在创建 Auto Scaling 组时使用 AWS CLI CloudFormation、或 SDK 向 Auto Scaling 组添加生命周期挂钩。

默认情况下，当您在控制台中添加生命周期挂钩时，Amazon EC2 Auto Scaling 会向亚马逊发送生命周期事件通知 EventBridge。建议使用 EventBridge 或用户数据脚本。要创建直接向 Amazon SNS、Amazon SQS 发送通知的生命周期挂钩， AWS Lambda 也可以使用命令，如[put-lifecycle-hook](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/put-lifecycle-hook.html)本主题的示例所示。

**Topics**
+ [添加生命周期钩子（控制台）](#adding-lifecycle-hooks-console)
+ [添加生命周期钩子 (AWS CLI)](#adding-lifecycle-hooks-aws-cli)

## 添加生命周期钩子（控制台）
<a name="adding-lifecycle-hooks-console"></a>

请按照以下步骤向您的自动扩缩组添加生命周期挂钩。要添加用于横向扩展（实例启动）和横向缩减（实例终止或返回至暖池）的生命周期挂钩，您必须创建两个单独的钩子。

如 [做好准备向 Auto Scaling 组添加生命周期钩子](prepare-for-lifecycle-notifications.md) 中所述，请在开始之前确认已设置自定义操作。

**为横向扩展添加生命周期挂钩**

1. 在上打开 Amazon EC2 控制台 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)，然后从导航窗格中选择 A **uto Scaling Gro** ups。

1. 选中您的自动扩缩组旁边的复选框。这时将在页面底部打开一个拆分窗格。

1. 在 **Instance management (实例管理)** 选项卡的 **Lifecycle hooks (生命周期挂钩)** 中，选择 **Create lifecycle hook (创建生命周期挂钩)**。

1. 要为横向扩展（实例启动）定义生命周期挂钩，请执行以下操作：

   1. 对于 **Lifecycle hook name (生命周期挂钩名称)**，请指定生命周期挂钩的名称。

   1. 对于**生命周期转换**，请选择**实例启动**。

   1. 对于**检测信号超时时间**，请在钩子超时之前，指定实例在横向扩展时保持等待状态的时长（以秒为单位）。范围从 `30` 到 `7200` 秒。设置的超时时段越长，完成您的自定义操作的时间越长。然后，如果您在超时期限结束之前完成，请发送[complete-lifecycle-action](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/complete-lifecycle-action.html)命令以允许实例进入下一个状态。

   1. 对于**默认结果**，指定在生命周期钩子超时结束或发生意外故障时要执行的操作。您可以选择**继续**或**放弃**。
      + 如果您选择**继续**，自动扩缩组可以继续执行任何其他生命周期挂钩，然后将实例投入使用。
      + 如果选择 **放弃**，自动扩缩组停止任何剩余操作并立即终止实例。

   1. （可选）对于**通知元数据**，请指定您希望在 Amazon EC2 Auto Scaling 向通知目标发送消息时包含的其他信息。

1. 选择**创建**。

**为横向缩减添加生命周期挂钩**

1. 选择**创建生命周期挂钩**，以从为横向扩展创建生命周期挂钩而中断的地方继续操作。

1. 要为横向缩减定义生命周期挂钩（实例终止或返回到暖池），请执行以下操作：

   1. 对于 **Lifecycle hook name (生命周期挂钩名称)**，请指定生命周期挂钩的名称。

   1. 对于**生命周期转换**，请选择**实例终止**。

   1. 对于**检测信号超时时间**，请在钩子超时之前，指定实例在横向扩展时保持等待状态的时长（以秒为单位）。我们建议将超时时间缩短`30`为`120`几秒，具体取决于执行任何最终任务（例如从中提取 EC2 日志）所需的时间 CloudWatch。

   1. 对于 **Default result**（默认结果），请指定超时结束或发生意外故障时 Auto Scaling 组执行的操作。**ABANDON**（放弃）和 **CONTINUE**（继续）都允许终止实例。
      + 如果您选择 **CONTINUE**（继续），Auto Scaling 组可以在终止之前继续执行任何剩余操作（如其他生命周期钩子）。
      + 如果选择 **放弃**，自动扩缩组将立即终止实例。

   1. （可选）对于**通知元数据**，请指定您希望在 Amazon EC2 Auto Scaling 向通知目标发送消息时包含的其他信息。

1. 选择**创建**。

## 添加生命周期钩子 (AWS CLI)
<a name="adding-lifecycle-hooks-aws-cli"></a>

使用 [put-lifecycle-hook](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/put-lifecycle-hook.html) 命令创建和更新生命周期挂钩。

要执行扩展操作，请使用以下命令。

```
aws autoscaling put-lifecycle-hook --lifecycle-hook-name my-launch-hook  \
  --auto-scaling-group-name my-asg \
  --lifecycle-transition autoscaling:EC2_INSTANCE_LAUNCHING
```

要执行缩减操作，请使用以下命令。

```
aws autoscaling put-lifecycle-hook --lifecycle-hook-name my-termination-hook  \
  --auto-scaling-group-name my-asg \
  --lifecycle-transition autoscaling:EC2_INSTANCE_TERMINATING
```

要使用 Amazon SNS 或 Amazon SQS 接收通知，请添加 `--notification-target-arn` 和 `--role-arn` 选项。要使用接收通知 AWS Lambda，请添加`--notification-target-arn`。

以下示例中创建了一个生命周期钩子，用于指定名为的 `my-sns-topic` 的 SNS 主题作为通知目标。

```
aws autoscaling put-lifecycle-hook --lifecycle-hook-name my-termination-hook  \
  --auto-scaling-group-name my-asg \
  --lifecycle-transition autoscaling:EC2_INSTANCE_TERMINATING \
  --notification-target-arn arn:aws:sns:region:123456789012:my-sns-topic \
  --role-arn arn:aws:iam::123456789012:role/my-notification-role
```

该主题将使用以下键/值对接收测试通知。

```
"Event": "autoscaling:TEST_NOTIFICATION"
```

默认情况下，该[put-lifecycle-hook](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/put-lifecycle-hook.html)命令会创建心跳超时为`3600`秒（一小时）的生命周期挂钩。

要更改现有生命周期钩子的检测信号超时时间，请添加 `--heartbeat-timeout` 选项，如以下示例所示。

```
aws autoscaling put-lifecycle-hook --lifecycle-hook-name my-termination-hook \
  --auto-scaling-group-name my-asg --heartbeat-timeout 120
```

如果实例已经处于等待状态，则可以使用 [record-lifecycle-action-heartbeat](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/record-lifecycle-action-heartbeat.html)CLI 命令记录心跳来防止生命周期挂钩超时。这会将超时时间增加到您创建生命周期挂钩时指定的超时值。如果您在超时期限结束之前完成，则可以发送 [complete-lifecycle-action](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/complete-lifecycle-action.html)CLI 命令以允许实例进入下一个状态。有关更多信息以及示例，请参阅 [在自动扩缩组中完成生命周期操作](completing-lifecycle-hooks.md)。