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

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

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

注意

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

生命周期挂钩的工作原理

向 Auto Scaling 组添加生命周期挂钩后,其工作方式如下:

  1. Auto Scaling 组响应横向扩展事件并开始启动实例。

  2. 生命周期挂钩将实例置于等待状态 (Pending:Wait),然后执行自定义操作。

    实例将保持等待状态,直到您使用完整生命周期操作CLI 命令或CompleteLifecycleAction操作,或者直至超时时段结束。默认情况下,实例将保持等待状态 1 小时,然后 Auto Scaling 组继续启动过程(Pending:Proceed)。如果您需要更长时间,可通过记录检测信号来重新开始超时时段。如果您在超时期限到期之前完成生命周期操作,则该时间段结束,Auto Scaling 组将继续启动过程。

  3. 实例将进入InService状态,运行状况检查宽限期将开始。如果 Auto Scaling 组与 Elastic Load Balancing 负载均衡器关联,则实例将向负载均衡器注册,并且负载均衡器开始检查其运行状况。运行状况检查宽限期结束后,Amazon EC2 Auto Scaling 开始检查实例的运行状况。

  4. Auto Scaling 组响应扩展事件并开始终止实例。如果 Auto Scaling 组由 Elastic Load Balancing 使用,则终止实例要首先从负载均衡器中取消注册。如果为负载均衡器启用了连接耗尽,则实例将停止接受新连接,并等待现有连接耗尽,然后再完成注销过程。

  5. 生命周期挂钩将实例置于等待状态 (Terminating:Wait),然后执行自定义操作。

    该实例将保持等待状态,直到您完成生命周期操作,或者直至超时期结束(默认情况下为 1 小时)。完成生命周期挂钩或超时期限过期后,实例将转换到下一个状态 (Terminating:Proceed)。

  6. 实例将终止。

下图阐释了此过程中 Auto Scaling 实例状态之间的过渡。


                使用生命周期挂钩的实例的生命周期。

注意事项和限制

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

  • 您可以配置启动生命周期钩子,以便在发生意外故障时放弃启动,在这种情况下,Amazon EC2 Auto Scaling 会自动终止并替换实例。

  • Amazon EC2 Auto Scaling 限制了在生命周期挂钩始终失败时允许实例启动的速率。

  • 您可以对 Spot 实例使用生命周期挂钩。不过,生命周期挂钩并不禁止在容量不再可用的情况下终止实例,这可能随时发送两分钟的中断通知。有关更多信息,请参阅 。Spot 实例中断中的适用于 Linux 实例的 Amazon EC2 用户指南

  • 在横向扩展时,Amazon EC2 Auto Scaling 不会将新实例计入 Auto Scaling 组的 CloudWatch 汇总指标,直到启动生命周期挂钩完成(并且扩展策略的预热时间完成)。在规模中,终止实例将继续作为组聚合指标的一部分计数,直到终止生命周期挂钩完成为止。

  • 当 Auto Scaling 组启动或终止简单扩展策略引起的实例时,冷却时间生效。冷却时间有助于确保 Auto Scaling 组不会在先前简单扩展活动产生明显效果之前启动或终止超过需要数量的实例。当发生生命周期操作且实例进入等待状态时,由简单扩展策略引起的扩展活动将暂停。生命周期操作完成后,冷却时间开始。如果为冷却时间设置了较长的时间间隔,则恢复扩展将会需要更长的时间。有关更多信息,请参阅 Amazon EC2 Auto Scaling 的扩展冷却时间

  • 有一个配额指定您可以为每个 Auto Scaling 组创建的最大生命周期挂钩数量。有关更多信息,请参阅 Amazon EC2 Auto Scaling 服务配额

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

保持实例处于等待状态

实例可以在有限的时间里保持等待状态。默认值为 1 小时(3600 秒)。

您可以通过以下方式调整超时段的持续时长:

  • 在创建生命周期挂钩时,设置生命周期挂钩的检测信号超时。对 put-lifecycle-hook 命令使用 --heartbeat-timeout 参数。对于 PutLifecycleHook 操作,请使用 HeartbeatTimeout 参数。

  • 如果您在超时时段结束前已使用 complete-lifecycle-action 命令或 CompleteLifecycleAction 操作完成操作,请继续下一状态。

  • 通过记录检测信号来推迟超时段结束,并使用记录生命周期动作心跳命令或RecordLifecycleActionHeartbeatoperation. 这会将超时时间增加到您创建生命周期挂钩时指定的超时值。例如,如果超时值为 1 小时,而您在 30 分钟后调用该命令,则实例将继续保持等待状态 1 个小时(总共为 90 分钟)。

您可以将实例保持在等待状态的最长时间是 48 小时或检测信号超时的 100 倍(以较小者为准)。

接收生命周期挂钩通知

您可以配置各种 EventBridge 规则以调用 Lambda 函数或在实例进入等待状态并且 Amazon EC2 Auto Scaling 向 EventBridge 提交生命周期操作的事件时发送通知。该事件包含有关实例是正在启动还是正在终止的信息,以及可用于控制生命周期操作的令牌。有关创建生命周期挂钩的入门教程风格指南,请参阅教程:配置调用 Lambda 函数的生命周期挂钩。有关生命周期操作发生时发出的事件的示例,请参阅Auto Scaling 事件

或者,如果您拥有在实例启动后配置实例的用户数据或 cloud-init 脚本,则无需配置通知。该脚本可使用运行时所在的实例的 ID 来控制生命周期操作。如果您尚未这样做,请更新脚本,从实例元数据中检索实例的实例 ID。有关更多信息,请参阅 。检索实例元数据中的适用于 Linux 实例的 Amazon EC2 用户指南。您可以在配置脚本完成时让脚本发出生命周期挂钩的信号,以允许实例继续进入下一个状态。

注意

Amazon EC2 Auto Scaling 控制台不提供为生命周期钩子定义 Amazon SNS 或 Amazon SQS 通知目标的选项。这些生命周期挂钩必须使用Amazon CLI或其中一个开发工具包。有关更多信息,请参阅 配置通知

GitHub 存储库

您可以访问我们的GitHub 存储库以下载生命周期挂钩的模板和脚本。

生命周期挂钩可用

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

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

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