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

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

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 组添加启动生命周期钩子,您可以确保引导启动脚本已成功完成,并且实例上的应用程序在生命周期钩子结束时准备好接受流量。

生命周期钩子可用性

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

事件 实例启动或终止¹ 最大实例生命周期:替换实例 实例刷新:替换实例 容量再平衡:替换实例 温水池:进入和离开温水池的实例
实例启动
实例终止

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

生命周期钩子的注意事项和限制

操作生命周期挂钩时,请记住以下注意事项和限制:

  • 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 存储库以下载生命周期钩子的模板和用户数据脚本。

有关生命周期挂钩的使用示例,请参阅以下博客帖子。