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

有关简介视频,请参阅 YouTube. 上的 Amazon 2018 重新发明:Amazon EC2 Auto Scaling 使容量管理变得轻松

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

使用生命周期钩子时,请记住以下注意事项和限制:

  • Amazon EC2 Auto Scaling 提供了自己的生命周期,以帮助管理 Auto Scaling 组。此生命周期与其他 EC2 实例的生命周期不同。有关更多信息,请参阅Amazon EC2 Auto Scaling 实例生命周期

  • 暖池中的实例也有自己的生命周期,如 暖池中实例的生命周期状态转换 中所述。

  • 您可以将生命周期钩子与竞价型实例一起使用,但生命周期钩子并不禁止在容量不再可用的情况下终止实例,这种情况会随时发生,并显示两分钟中断通知。有关更多信息,请参阅适用于 Linux 实例的 Amazon EC2 用户指南中的 竞价型实例中断。但是,您可以启用“Capacity Rebalancing”(容量再平衡)以主动替换已从 Amazon EC2 Spot 服务获得再平衡建议的竞价型实例,该信号是在竞价型实例处于较高中断风险时发送的。有关更多信息,请参阅使用容量重新平衡来处理 Amazon EC2 竞价型实例中断

  • 横向扩展时,直到启动生命周期钩子结束之后,Amazon EC2 Auto Scaling 才会将新实例计入 Auto Scaling 组的聚合 CloudWatch 实例指标(例如 CPUUtilization、NetworkIn、NetworkOut 等)。如果未启用原定设置实例预热,或者已经启用了该功能但设置为 0,则 Auto Scaling 实例会在实例到达 InService 状态时立即开始向聚合实例指标提供使用情况数据。有关更多信息,请参阅为 Auto Scaling 组设置原定设置实例预热

    在横向缩减时,聚合实例指标可能无法立即反映出终止实例的移除情况。Amazon EC2 Auto Scaling 终止工作流程开始后不久,终止实例将停止作为该组聚合实例指标的一部分计入。

  • 当 Auto Scaling 组启动或终止实例时,由简单扩缩策略引发的扩缩活动将暂停。如果调用生命周期钩子,由简单扩缩策略引发的扩缩活动将暂停,直至生命周期操作完成并且冷却时间已过期。为冷却时间设置较长的时间间隔意味着,恢复扩展将会需要更长的时间。有关更多信息,请参阅Amazon EC2 Auto Scaling 的缩放冷却时间

  • 实例可以在有限的时间里保持等待状态。生命周期钩子的默认超时时间为一小时(检测信号超时时间)。此外,还有一个全局超时时间,它指定您可以将实例保持在等待状态的最长时间。全局超时时间为 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 时一次性创建生命周期钩子。

生命周期钩子可用性

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

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

¹ 适用于创建或删除组、组自动扩展或手动调整组所需容量时启动或终止的实例。当您附加或分离实例、将实例移入或移出备用模式或使用强制删除选项删除组时,不适用。

示例

我们还提供了一些 JSON 和 YAML 模板代码段,您可以用其了解如何在 Amazon CloudFormation 堆栈模板中声明生命周期钩子。有关更多信息,请参阅 Amazon CloudFormation 用户指南中的 亚马逊云科技::AutoScaling::LifecycleHook 参考。

您还可以访问我们的 GitHub 存储库以下载生命周期钩子的模板和用户数据脚本。

有关使用生命周期钩子的其他示例,请参阅以下博客文章:使用 Lambda 和 Amazon EC2 运行命令为扩展实例构建备用系统在终止 EC2 Auto Scaling 实例之前运行代码