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

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

Amazon EC2 Auto Scaling 生命周期挂钩

生命周期挂钩使您能够执行自定义操作 暂停 实例 Auto Scaling 组启动或终止该组。当实例暂停时,它将保持在等待状态之前,直到您使用 complete-lifecycle-action 命令或 CompleteLifecycleAction 操作,或直到超时期结束(默认情况下1小时)。

例如,假设您新启动的实例已完成其启动序列,一个生命周期挂钩暂停该实例。该实例处于等待状态时,您可以在其上安装或配置软件,确保您的实例在开始接收流量前已完全准备好。有关使用生命周期挂钩的另一个示例,假设在发生缩减事件时,终止实例要首先从负载均衡器中取消注册(如果 Auto Scaling 组由 Elastic Load Balancing 使用)。然后,生命周期挂钩会在将实例终止之前将其暂停。当实例处于等待状态时,您可以执行连接到实例并下载日志或其他数据等操作,然后再将该实例完全终止。

每个 Auto Scaling 组均可具有多个生命周期挂钩。但是,每个 Auto Scaling 组的挂钩数存在限制。有关更多信息,请参阅 Amazon EC2 Auto Scaling 服务配额.

生命周期挂钩如何工作

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

  1. TheThethe Auto Scaling 通过终止实例,组响应横向扩展事件,通过启动实例和横向扩展事件。

  2. 生命周期挂钩将实例置于等待状态(Pending:Wait 或 )。Terminating:Wait). 实例将暂停,直至您继续或者超时时段结束。

  3. 您可以使用下面的一个或多个选项来执行自定义操作:

    • 定义 EventBridge 用于调用A的目标 Lambda 生命周期操作发生时的功能。TheThethe Lambda 函数在调用时调用 Amazon EC2 Auto Scaling 将生命周期操作的事件提交至 EventBridge. 该事件包含有关实例是正在启动还是正在终止的信息,以及可用于控制生命周期操作的令牌。

    • 为生命周期挂钩定义一个通知目标。Amazon EC2 Auto Scaling 将向该通知目标发送消息。该消息包含有关实例是正在启动还是正在终止的信息,以及可用于控制生命周期操作的令牌。

    • 创建一个脚本,当实例启动时,该脚本将在实例上运行。该脚本可使用运行时所在的实例的 ID 来控制生命周期操作。

  4. 默认情况下,实例保持在等待状态一小时,然后 Auto Scaling 组继续启动或终止流程(Pending:ProceedTerminating:Proceed)。如果您需要更长时间,可通过记录检测信号来重新开始超时时段。如果您在超时时段结束前已完成此操作,则可以完成生命周期操作,从而继续启动或终止过程。

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


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

有关 Auto Scaling 组中实例的完整生命周期的更多信息,请参阅。Amazon EC2 Auto Scaling 实例生命周期.

Considerations

向 Auto Scaling 组添加生命周期挂钩,使您可以对实例的启动和终止方式进行更多控制。下面是在向 Auto Scaling 组添加生命周期挂钩时为确保组按预期方式继续执行而要考虑的一些事项。

保留等待状态的实例

实例可以在有限的时间里保持等待状态。默认值为 1 小时(3600 秒)。您可以通过以下方式调整该时长:

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

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

  • 通过记录心跳,使用 record-lifecycle-action-heartbeat 命令或 RecordLifecycleActionHeartbeat 操作。这会将超时时间增加到您创建生命周期挂钩时指定的超时值。例如,如果超时值为 1 小时,而您在 30 分钟后调用该命令,则实例将继续保持等待状态 1 个小时(总共为 90 分钟)。

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

简单缩放的冷却期

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

运行状况检查宽限期

如果添加一个生命周期挂钩,在生命周期挂钩操作完成并且实例进入 InService 状态后,运行状况检查宽限期才会开始。

Spot 实例

您可以对 Spot 实例使用生命周期挂钩。但是,生命周期挂钩并不禁止在容量不再可用的情况下终止实例。此外,当点实例终止时,您仍必须完成生命周期操作(使用 complete-lifecycle-action 命令或 CompleteLifecycleAction 操作)。

准备通知

您可以为实例进入等待状态时配置通知。您可以使用 Amazon EventBridge, Amazon SNS,或 Amazon SQS 接收通知。有关更多信息,请参阅 配置生命周期挂钩通知.

或者,如果您拥有在实例启动时配置实例的脚本,则无需在生命周期操作发生时接收通知。如果您尚未这样做,请更新脚本,从实例元数据中检索实例的实例 ID。有关详细信息,请参阅 检索实例元数据Amazon EC2 用户指南(适用于 Linux 实例).

添加生命周期挂钩

当您将生命周期挂钩添加到您的 Auto Scaling 您可以指定在实例启动或终止时是否应运行该组 Auto Scaling 组。

添加生命周期挂钩(控制台)

请按照以下步骤向现有 Auto Scaling 组添加生命周期挂钩。您可以指定是在实例启动还是终止时使用挂钩,以及在放弃或继续之前等待生命周期挂钩完成的时间。

添加生命周期挂钩

  1. 打开 Amazon EC2 控制台 https://console.amazonaws.cn/ec2/

  2. 在导航窗格中, 自动缩放,选择 Auto Scaling 组.

  3. 选中您的 Auto Scaling 组旁边的复选框。

    分割窗格可以在 自动缩放组 页面,显示所选组的信息。

  4. 实例管理 选项卡, 生命周期挂钩,选择 创建生命周期挂钩. (旧控制台: 生命周期挂钩 选项卡可以创建生命周期挂钩。)

  5. 要定义生命周期挂钩,请执行以下操作:

    1. 对于 生命周期挂钩名称,指定LifecycleHook的名称。

    2. 对于 生命周期过渡,选择 实例启动实例终止.

    3. 指定超时值 心跳超时,允许您控制实例保持等待状态的时间量。该值必须介于 30 到 7200 秒之间。例如,您可以在超时期间登录到新启动的实例,并安装应用程序或执行自定义操作。

    4. 对于 默认结果,指定 Auto Scaling 当生命周期挂钩超时时间超时或发生意外故障时,组将会执行。您可以选择“放弃”或“继续”。

      如果实例正在启动,“继续”指示您的操作已成功,并且 Auto Scaling 组可将实例投入使用。否则,ABANDON 指示您的自定义操作未成功,并且 Auto Scaling 可终止实例。如果实例正在终止,“放弃”和“继续”都允许终止实例。不过,“放弃”将停止任何剩余操作(例如,其他生命周期挂钩),而“继续”将允许完成任何其他生命周期挂钩。

    5. (可选) 通知元数据,指定您希望随时添加的其他信息 Amazon EC2 Auto Scaling 发送消息到通知目标。

  6. 选择 创建.

添加生命周期挂钩(AWS CLI)

使用 put-lifecycle-hook 命令。

要执行扩展操作,请使用以下命令。

aws autoscaling put-lifecycle-hook --lifecycle-hook-name my-hook --auto-scaling-group-name my-asg \ --lifecycle-transition autoscaling:EC2_INSTANCE_LAUNCHING

要执行缩减操作,请使用以下命令。

aws autoscaling put-lifecycle-hook --lifecycle-hook-name my-hook --auto-scaling-group-name my-asg \ --lifecycle-transition autoscaling:EC2_INSTANCE_TERMINATING

要使用 Amazon SNS 或 Amazon SQS,您必须指定通知目标和 IAM 角色。有关更多信息,请参阅 配置通知 Amazon EC2 Auto Scaling 生命周期挂钩.

例如,添加以下选项可将 SNS 主题指定为通知目标。

--notification-target-arn arn:aws-cn:sns:region:123456789012:my-sns-topic --role-arn arn:aws-cn:iam::123456789012:role/my-notification-role

该主题将使用以下键/值对接收测试通知。

"Event": "autoscaling:TEST_NOTIFICATION"

完成生命周期挂钩自定义操作

当 Auto Scaling 组响应扩展或缩减事件时,它会将实例置于等待状态并根据生命周期挂钩的配置方式发送通知。

完成生命周期挂钩自定义操作

  1. 收到通知后,您可以在实例处于等待状态时执行自定义操作。

  2. 如果您需要更多时间来完成自定义操作,请使用 record-lifecycle-action-heartbeat 命令以重新启动超时时间段,并将实例保持在等待状态。您可以指定随通知一起接收的生命周期操作令牌,如以下命令所示。

    aws autoscaling record-lifecycle-action-heartbeat --lifecycle-hook-name my-launch-hook \ --auto-scaling-group-name my-asg --lifecycle-action-token bcd2f1b8-9a78-44d3-8a7a-4dd07d7cf635

    或者,可以指定在上一步中接收的实例的 ID,如以下命令所示。

    aws autoscaling record-lifecycle-action-heartbeat --lifecycle-hook-name my-launch-hook \ --auto-scaling-group-name my-asg --instance-id i-1a2b3c4d
  3. 如果在超时期结束前完成自定义操作,请使用 complete-lifecycle-action 命令 Auto Scaling 组可以继续启动或终止实例。您可以指定生命周期操作令牌,如以下命令所示。

    aws autoscaling complete-lifecycle-action --lifecycle-action-result CONTINUE \ --lifecycle-hook-name my-launch-hook --auto-scaling-group-name my-asg \ --lifecycle-action-token bcd2f1b8-9a78-44d3-8a7a-4dd07d7cf635

    或者,您可以指定实例的 ID,如以下命令所示。

    aws autoscaling complete-lifecycle-action --lifecycle-action-result CONTINUE \ --instance-id i-1a2b3c4d --lifecycle-hook-name my-launch-hook \ --auto-scaling-group-name my-asg

测试通知

要生成启动事件通知,请更新 Auto Scaling 通过增加 Auto Scaling 组1。您将在实例启动后的几分钟内收到通知。

更改所需容量(控制台)

  1. 打开 Amazon EC2 控制台 https://console.amazonaws.cn/ec2/

  2. 在导航窗格中, 自动缩放,选择 Auto Scaling 组.

  3. 选中您的 Auto Scaling 组旁边的复选框。

    分割窗格可以在 自动缩放组 页面,显示所选组的信息。

  4. 详情 选项卡,选择 组详情编辑. (旧控制台:在 详情 选项卡,选择 编辑.)

  5. 对于 期望容量,将当前值增加1。如果此值超出 最大容量,您还必须增加 最大容量 按1。

  6. 选择 更新.

  7. 在数分钟后,您将收到事件的通知。如果您不需要为此测试启动的附加实例,则可以减少 期望容量 按1。在数分钟后,您将收到事件的通知。