

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

# Amazon EC2 Auto Scaling 生命周期钩子
<a name="lifecycle-hooks"></a>

Amazon EC2 Auto Scaling 能够将生命周期钩子添加到您的 Auto Scaling 组。这些钩子使 Auto Scaling 组可让您创建解决方案，这些解决方案了解 Auto Scaling 实例生命周期中的事件，然后在发生相应的生命周期事件时对实例执行自定义操作。生命周期钩子提供了指定的时间（预设情况下为 1 小时），以在实例转换到下一个状态之前等待操作完成。

作为将生命周期钩子与 Auto Scaling 实例一起使用的示例：
+ 在发生向外扩展事件时，您新启动的实例将完成其启动序列并转换到等待状态。该实例处于等待状态时，它将运行脚本以下载和安装您的应用程序所需的软件包，确保您的实例在开始接收流量前已完全准备好。脚本安装完软件后，它会发送 **complete-lifecycle-action** 命令以继续。
+ 发生缩减事件时，生命周期挂钩会在实例终止之前将其暂停，并使用 Amazon 向您发送通知。 EventBridge当实例处于等待状态时，您可以在实例完全终止之前调用 Amazon Lambda 函数或连接到该实例来下载日志或其他数据。

生命周期钩子的一个常见用途是控制何时在 Elastic Load Balancing 中注册实例。通过向您的 Auto Scaling 组添加启动生命周期钩子，您可以确保引导启动脚本已成功完成，并且实例上的应用程序在生命周期钩子结束时准备好接受流量。

**Topics**
+ [生命周期钩子可用性](#lifecycle-hooks-availability)
+ [注意事项和限制](#lifecycle-hook-considerations)
+ [相关资源](#lifecycle-hook-related-resources)
+ [生命周期挂钩在自动扩缩组中如何工作](lifecycle-hooks-overview.md)
+ [做好准备添加生命周期钩子](prepare-for-lifecycle-notifications.md)
+ [使用实例生命周期策略控制实例保留](instance-lifecycle-policy.md)
+ [检索目标生命周期状态](retrieving-target-lifecycle-state-through-imds.md)
+ [向自动扩缩组添加生命周期挂钩](adding-lifecycle-hooks.md)
+ [在自动扩缩组中完成生命周期操作](completing-lifecycle-hooks.md)
+ [教程：使用实例元数据检索生命周期状态](tutorial-lifecycle-hook-instance-metadata.md)
+ [教程：配置调用 Lambda 函数的生命周期钩子](tutorial-lifecycle-hook-lambda.md)

## 生命周期钩子可用性
<a name="lifecycle-hooks-availability"></a>

下表列出了可用于各种方案的生命周期钩子。


| 事件 | 实例启动或终止¹ | [最大实例生命周期](asg-max-instance-lifetime.md)：替换实例 | [实例刷新](asg-instance-refresh.md)：替换实例 | [容量再平衡](ec2-auto-scaling-capacity-rebalancing.md)：替换实例 | [温水池](ec2-auto-scaling-warm-pools.md)：进入和离开温水池的实例 | 
| --- | --- | --- | --- | --- | --- | 
| 实例启动 | ✓ | ✓ | ✓ | ✓ | ✓ | 
| 实例终止 | ✓ | ✓ | ✓ | ✓ | ✓ | 

¹ 适用于所有启动和终止，无论是自动启动还是手动启动，例如当您调用 `SetDesiredCapacity` 或 `TerminateInstanceInAutoScalingGroup` 操作时。当您附加或分离实例、将实例移入或移出备用模式或使用强制删除选项删除组时，不适用。

## 生命周期钩子的注意事项和限制
<a name="lifecycle-hook-considerations"></a>

操作生命周期挂钩时，请记住以下注意事项和限制：
+ Amazon EC2 Auto Scaling 提供了自己的生命周期，以帮助管理 Auto Scaling 组。此生命周期与其他 EC2 实例的生命周期不同。有关更多信息，请参阅 [Amazon EC2 Auto Scaling 实例生命周期](ec2-auto-scaling-lifecycle.md)。暖池中的实例也有自己的生命周期，如 [暖池中实例的生命周期状态转换](warm-pool-instance-lifecycle.md#lifecycle-state-transitions) 中所述。
+  默认情况下，终止生命周期挂钩会尽力运行。如果终止生命周期挂钩超时或被放弃，Amazon EC2 Auto Scaling 会立即终止该实例。您可以将终止生命周期挂钩与用于实例保留的实例生命周期策略相结合。有关更多信息，请参阅 [使用实例生命周期策略控制实例保留](instance-lifecycle-policy.md)。
+ 您可以将生命周期钩子与竞价型实例一起使用，但生命周期钩子并不禁止在容量不再可用的情况下终止实例，这种情况会随时发生，并显示两分钟中断通知。有关更多信息，请参阅 *Amazon EC2 用户指南*中的[竞价型实例中断情况](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/spot-interruptions.html)。但是，您可以启用“Capacity Rebalancing”（容量再平衡）以主动替换已从 Amazon EC2 Spot 服务获得再平衡建议的竞价型实例，该信号是在竞价型实例处于较高中断风险时发送的。有关更多信息，请参阅 [Auto Scaling 进行容量再平衡以替换存在风险的竞价型实例](ec2-auto-scaling-capacity-rebalancing.md)。
+ 实例可以在有限的时间里保持等待状态。生命周期钩子的默认超时时间为一小时（检测信号超时时间）。此外，还有一个全局超时时间，它指定您可以将实例保持在等待状态的最长时间。全局超时时间为 48 小时或检测信号超时时间的 100 倍，以较小者为准。
+ 生命周期挂钩的结果可以是放弃或继续。如果实例正在启动，继续指示您的操作已成功，并且 Amazon EC2 Auto Scaling组可将实例投入使用。否则，“放弃”指示您的自定义操作未成功，并且可终止并替代实例。如果实例正在终止，放弃和继续都允许终止实例。不过，放弃将停止任何剩余操作（例如，其他生命周期钩子），而继续将允许完成任何其他生命周期钩子。
+ Amazon EC2 Auto Scaling 会限制在生命周期钩子始终失败时允许实例启动的速率，因此请务必测试并修复生命周期操作中的任何永久性错误。
+ 使用 Amazon CLI Amazon CloudFormation、或 SDK 创建和更新生命周期挂钩提供了从中创建生命周期挂钩时不可用的选项 Amazon Web Services 管理控制台。例如，用于指定 SNS 主题或 SQS 队列的 ARN 的字段不会出现在控制台中，因为 Amazon EC2 Auto Scaling 已经向亚马逊发送了事件。 EventBridge可以根据需要筛选这些事件并将其重定向到 Lambda、Amazon SNS 和亚马逊 SQS 等 Amazon 服务。
+ 您可以在创建 Auto Scaling 群组时向该组添加多个生命周期挂钩，方法是使用 Amazon CLI Amazon CloudFormation、或 SDK 调用 [CreateAutoScalingGroup](https://docs.amazonaws.cn/autoscaling/ec2/APIReference/API_CreateAutoScalingGroup.html)API。但是，如果指定，每个钩子必须具有相同的通知目标和 IAM 角色。要创建具有不同通知目标和不同角色的生命周期挂钩，请在对 [PutLifecycleHook](https://docs.amazonaws.cn/autoscaling/ec2/APIReference/API_PutLifecycleHook.html)API 的单独调用中逐个创建生命周期挂钩。
+ 如果您为实例启动添加了生命周期挂钩，那么运行状况检查宽限期将在实例达到 `InService` 状态时立即开始。有关更多信息，请参阅 [设置自动扩缩组的运行状况检查宽限期](health-check-grace-period.md)。

**扩展注意事项**
+ 动态扩展策略会根据跨多个实例聚合的 CloudWatch 指标数据（例如 CPU 和网络 I/O）向内和向外扩展。在横向扩展时，Amazon EC2 Auto Scaling 不会立即将新实例计入自动扩缩组的聚合实例指标。它会一直等到实例达到 `InService` 状态并且实例预热完成时再计入。有关默认实例预热主题的更多信息，请参阅 [扩缩性能注意事项](ec2-auto-scaling-default-instance-warmup.md#scaling-performance-considerations)。
+ 在横向缩减时，聚合实例指标可能无法立即反映出终止实例的移除情况。Amazon EC2 Auto Scaling 终止工作流程开始后不久，终止实例将停止作为该组聚合实例指标的一部分计入。
+ 如果调用生命周期挂钩，由简单扩缩策略引发的扩缩活动将暂停，直至生命周期操作完成并且冷却时间过期。为冷却时间设置较长的时间间隔意味着，恢复扩展将会需要更长的时间。有关更多信息，请参阅冷却主题中的[生命周期挂钩可能会导致额外的延迟](ec2-auto-scaling-scaling-cooldowns.md#cooldowns-lifecycle-hooks)。通常，如果您可以改用步进扩缩策略或目标跟踪扩缩策略，我们建议不要使用简单扩缩策略。

## 相关资源
<a name="lifecycle-hook-related-resources"></a>

有关介绍视频，请参阅 re [Amazon : Invent 2018：开启 Amazon EC2 Auto Scaling 让容量管理变得简单](https://youtu.be/PideBMIcwBQ?t=469)。*YouTube*

我们提供了几个 JSON 和 YAML 模板片段，您可以使用它们来了解如何在 Amazon CloudFormation 堆栈模板中声明生命周期挂钩。有关更多信息，请参阅《*Amazon CloudFormation 用户指南*》中的[AWS::AutoScaling::LifecycleHook](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-lifecyclehook.html)参考资料。

您也可以访问我们的[GitHub存储库](https://github.com/aws-samples/amazon-ec2-auto-scaling-group-examples)，下载生命周期挂钩的示例模板和用户数据脚本。

有关生命周期挂钩的使用示例，请参阅以下博客帖子。
+ [使用 Lambda 和 Amazon EC2 运行命令为扩缩实例构建备用系统](https://www.amazonaws.cn/blogs/compute/building-a-backup-system-for-scaled-instances-using-aws-lambda-and-amazon-ec2-run-command/)
+ [在终止 EC2 Auto Scaling 实例之前运行代码](https://www.amazonaws.cn/blogs/infrastructure-and-automation/run-code-before-terminating-an-ec2-auto-scaling-instance/)。