本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Amazon EC2 Auto Scaling 生命周期钩子
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 组添加启动生命周期钩子,您可以确保引导启动脚本已成功完成,并且实例上的应用程序在生命周期钩子结束时准备好接受流量。
内容
生命周期钩子可用性
下表列出了可用于各种方案的生命周期钩子。
¹ 适用于所有启动和终止,无论是自动启动还是手动启动,例如当您调用 SetDesiredCapacity
或 TerminateInstanceInAutoScalingGroup
操作时。当您附加或分离实例、将实例移入或移出备用模式或使用强制删除选项删除组时,不适用。
生命周期钩子的注意事项和限制
操作生命周期挂钩时,请记住以下注意事项和限制:
-
Amazon EC2 Auto Scaling 提供了自己的生命周期,以帮助管理 Auto Scaling 组。此生命周期与其他 EC2 实例的生命周期不同。有关更多信息,请参阅 Amazon EC2 Auto Scaling 实例生命周期。暖池中的实例也有自己的生命周期,如 暖池中实例的生命周期状态转换 中所述。
-
您可以将生命周期钩子与竞价型实例一起使用,但生命周期钩子并不禁止在容量不再可用的情况下终止实例,这种情况会随时发生,并显示两分钟中断通知。有关更多信息,请参阅 Amazon EC2 用户指南中的竞价型实例中断情况。但是,您可以启用“Capacity Rebalancing”(容量再平衡)以主动替换已从 Amazon EC2 Spot 服务获得再平衡建议的竞价型实例,该信号是在竞价型实例处于较高中断风险时发送的。有关更多信息,请参阅 使用容量重新平衡来处理 Amazon EC2 竞价型实例中断。
-
实例可以在有限的时间里保持等待状态。生命周期钩子的默认超时时间为一小时(检测信号超时时间)。此外,还有一个全局超时时间,它指定您可以将实例保持在等待状态的最长时间。全局超时时间为 48 小时或检测信号超时时间的 100 倍,以较小者为准。
-
生命周期挂钩的结果可以是放弃或继续。如果实例正在启动,继续指示您的操作已成功,并且 Amazon EC2 Auto Scaling组可将实例投入使用。否则,“放弃”指示您的自定义操作未成功,并且可终止并替代实例。如果实例正在终止,放弃和继续都允许终止实例。不过,放弃将停止任何剩余操作(例如,其他生命周期钩子),而继续将允许完成任何其他生命周期钩子。
-
Amazon EC2 Auto Scaling 会限制在生命周期钩子始终失败时允许实例启动的速率,因此请务必测试并修复生命周期操作中的任何永久性错误。
-
使用 Amazon CLI、Amazon CloudFormation 或开发工具包创建和更新生命周期钩子时,会提供在从 Amazon Web Services Management Console 创建生命周期钩子时无法使用的选项。例如,用于指定 SNS 主题或 SQS 队列的 ARN 的字段不会显示在控制台中,因为 Amazon EC2 Auto Scaling 已向 Amazon EventBridge 发送事件。这些事件可以根据需要被筛选并重新导向到 Amazon 服务,如 Lambda、Amazon SNS 和 Amazon SQS。
-
您可以在创建 Auto Scaling 组时将多个生命周期钩子添加到该组,方法是使用 Amazon CLI、Amazon CloudFormation 或开发工具包调用 CreateAutoScalingGroup API。但是,如果指定,每个钩子必须具有相同的通知目标和 IAM 角色。要创建具有不同通知目标和不同角色的生命周期钩子,请在单独调用 PutLifecycleHook API 时一次性创建生命周期钩子。
-
如果您为实例启动添加了生命周期挂钩,那么运行状况检查宽限期将在实例达到
InService
状态时立即开始。有关更多信息,请参阅 设置自动扩缩组的运行状况检查宽限期。
扩展注意事项
-
动态扩缩策略会横向缩减和横向扩展,以响应跨多个实例聚合的 CloudWatch 指标数据(例如 CPU 和网络 I/O)。在横向扩展时,Amazon EC2 Auto Scaling 不会立即将新实例计入自动扩缩组的聚合实例指标。它会一直等到实例达到
InService
状态并且实例预热完成时再计入。有关默认实例预热主题的更多信息,请参阅 扩缩性能注意事项。 -
在横向缩减时,聚合实例指标可能无法立即反映出终止实例的移除情况。Amazon EC2 Auto Scaling 终止工作流程开始后不久,终止实例将停止作为该组聚合实例指标的一部分计入。
-
如果调用生命周期挂钩,由简单扩缩策略引发的扩缩活动将暂停,直至生命周期操作完成并且冷却时间过期。为冷却时间设置较长的时间间隔意味着,恢复扩展将会需要更长的时间。有关更多信息,请参阅冷却主题中的生命周期挂钩可能会导致额外的延迟。通常,如果您可以改用步进扩缩策略或目标跟踪扩缩策略,我们建议不要使用简单扩缩策略。
相关资源
有关简介视频,请参阅 YouTube 上的 Amazon re:Invent 2018:Amazon EC2 Auto Scaling 使容量管理变得轻松
我们还提供了一些 JSON 和 YAML 模板代码段,您可以用其了解如何在 Amazon CloudFormation 堆栈模板中声明生命周期钩子。有关更多信息,请参阅 Amazon CloudFormation 用户指南中的 亚马逊云科技::AutoScaling::LifecycleHook 参考。
您还可以访问我们的 GitHub 存储库
有关生命周期挂钩的使用示例,请参阅以下博客帖子。