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. Auto Scaling 组通过启动实例来响应扩展事件,通过终止实例来响应缩减事件。

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

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

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

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

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

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

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


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

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

注意事项

向 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 实例使用生命周期挂钩。但是,生命周期挂钩并不禁止在容量不再可用的情况下终止实例。此外,在 Spot 实例终止时,您仍需完成生命周期操作(使用 complete-lifecycle-action 命令或 CompleteLifecycleAction 操作)。

准备通知

您可以为实例进入等待状态时配置通知。您可以使用 Amazon CloudWatch Events、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 下,选择 Auto Scaling Groups (Auto Scaling 组)

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

    将在 Auto Scaling groups (Auto Scaling 组) 页面底部打开一个拆分窗格,其中显示有关所选组的信息。

  4. Instance management (实例管理) 选项卡的 Lifecycle hooks (生命周期挂钩) 中,选择 Create lifecycle hook (创建生命周期挂钩)。(旧控制台:您可以通过生命周期挂钩选项卡创建生命周期挂钩。)

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

    1. 对于 Lifecycle hook name (生命周期挂钩名称),请指定生命周期挂钩的名称。

    2. 对于 Lifecycle transition (生命周期转换),请选择 Instance launch (实例启动)Instance terminate (实例终止)

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

    4. 对于 Default result (默认结果),请指定生命周期挂钩超时结束或发生意外故障时 Auto Scaling 组执行的操作。您可以选择“放弃”或“继续”。

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

    5. (可选)对于 Notification metadata (通知元数据),请指定您希望在 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 组的所需容量增加 1 来更新 Auto Scaling 组。您将在实例启动后的几分钟内收到通知。

更改所需容量(控制台)

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

  2. 在导航窗格上的 AUTO SCALING 下,选择 Auto Scaling Groups (Auto Scaling 组)

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

    将在 Auto Scaling groups (Auto Scaling 组) 页面底部打开一个拆分窗格,其中显示有关所选组的信息。

  4. Details (详细信息) 选项卡上,选择 Group details (组详细信息)Edit (编辑)。(旧控制台:在 Details (详细信息) 选项卡上,选择 Edit (编辑)。)

  5. 对于 Desired capacity (所需容量),将当前值增加 1。如果此值超过 Maximum capacity (最大容量),则还必须将 Maximum capacity (最大容量) 的值增加 1。

  6. 选择 Update (更新)

  7. 在数分钟后,您将收到事件的通知。如果您不需要您为此测试启动的其他实例,则可以将 Desired capacity (所需容量) 减少 1。在数分钟后,您将收到事件的通知。