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 运行命令为扩展实例构建备用系统