Auto Scaling
用户指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

Auto Scaling 生命周期挂钩

Auto Scaling 生命周期挂钩使您能够在 Auto Scaling 启动或终止实例时通过暂停实例执行自定义操作。例如,当新启动的实例暂停时,您可以在其上安装或配置软件。

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

生命周期挂钩的工作方式

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

  1. Auto Scaling 通过启动实例来响应扩大事件,并通过终止实例来响应缩小事件。

  2. Auto Scaling 将实例置于等待状态(Pending:WaitTerminating:Wait)。实例将暂停,直至您告知 Auto Scaling 继续或者超时时段结束。

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

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

    • 为生命周期钩子定义一个通知目标。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 组只根据需要启动或终止合适数量的实例。

考虑在实例启动时使用包含支持自定义操作的声明周期挂钩的 Auto Scaling 组。当应用程序需求增加时,Auto Scaling 会启动实例以增加容量。由于存在生命周期挂钩,实例会置于 Pending:Wait 状态,这意味着该实例尚无法用于处理流量。当实例进入等待状态时,简单扩展策略引起的扩展操作会暂停。当实例进入 InService 状态时,冷却时间开始。冷却时间过后,所有暂停的扩展操作都会恢复。

运行状况检查宽限期

如果您通过添加生命周期挂钩在实例启动时执行操作,在完成生命周期挂钩并且实例进入 InService 状态后,健康检查宽限期才会启动。

生命周期操作结果

生命周期挂钩结束时,结果为 ABANDONCONTINUE

如果实例正在启动,则 CONTINUE 指示您的操作已成功,并且 Auto Scaling 可将实例投入使用。否则,ABANDON 指示您的自定义操作未成功,并且 Auto Scaling 可终止实例。

如果实例正在终止,则 ABANDONCONTINUE 都允许终止实例。不过,ABANDON 将停止任何剩余操作(例如,其他生命周期挂钩),而 CONTINUE 将允许完成任何其他生命周期挂钩。

竞价型实例

您可以对竞价型实例使用生命周期挂钩。但是,生命周期挂钩不会阻止实例因竞价价格更改(随时可能发生)而终止。此外,在竞价型实例终止时,您仍需完成生命周期操作(使用 complete-lifecycle-action 命令或 CompleteLifecycleAction 操作)。

准备通知

您可以选择配置当实例进入等待状态时的通知,这能让您执行自定义操作。您可以使用 Amazon CloudWatch Events、Amazon SNS 或 Amazon SQS 接收通知。选择您喜好的选项。

或者,如果您拥有在实例启动时配置实例的脚本,则无需在生命周期操作发生时接收通知。如果您尚未这样做,请更新脚本,从实例元数据中检索实例的实例 ID。有关更多信息,请参阅检索实例元数据

使用 CloudWatch Events 接收通知

您可以使用 CloudWatch Events 设置一个目标以在生命周期操作发生时调用 Lambda 函数。

使用 CloudWatch Events 设置通知

  1. 使用创建 Lambda 函数中的步骤创建 Lambda 函数,并记下其 Amazon 资源名称 (ARN)。例如:arn:aws:lambda:us-west-2:123456789012:function:my-function

  2. 使用以下 put-rule 命令创建与生命周期操作匹配的 CloudWatch Events 规则:

    Copy
    aws events put-rule --name my-rule --event-pattern file://pattern.json --state ENABLED

    实例启动生命周期操作的 pattern.json 为:

    Copy
    { "source": [ "aws.autoscaling" ], "detail-type": [ "EC2 Instance-launch Lifecycle Action" ] }

    实例终止生命周期操作的 pattern.json 为:

    Copy
    { "source": [ "aws.autoscaling" ], "detail-type": [ "EC2 Instance-terminate Lifecycle Action" ] }
  3. 使用以下 add-permission 命令授予调用 Lambda 函数的规则权限。此命令信任 CloudWatch Events 服务委托人 (events.amazonaws.com),并将权限范围划定为指定规则。

    Copy
    aws lambda add-permission \ --function-name LogScheduledEvent \ --statement-id my-scheduled-event \ --action 'lambda:InvokeFunction' \ --principal events.amazonaws.com \ --source-arn arn:aws:events:us-east-1:123456789012:rule/my-scheduled-rule
  4. 使用以下 put-targets 命令创建一个目标,此目标在生命周期操作发生时调用 Lambda 函数:

    Copy
    aws events put-targets --rule my-rule --targets Id=1,Arn=arn:aws:lambda:us-west-2:123456789012:function:my-function
  5. 当 Auto Scaling 响应扩展或收缩事件时,它将实例置于等待状态。当实例处于等待状态时,Lambda 函数将被调用。有关事件数据的更多信息,请参阅 Auto Scaling 事件

使用 Amazon SNS 接收通知

您可以使用 Amazon SNS 设置通知目标以便在生命周期操作开始时接收通知。

使用 Amazon SNS 设置通知

  1. 使用 Amazon SNS 创建目标。有关更多信息,请参阅 Amazon Simple Notification Service 开发人员指南 中的创建主题。记下目标的 ARN(例如 arn:aws:sns:us-west-2:123456789012:my-sns-topic)。

  2. 使用 IAM 用户指南 中的创建向 AWS 服务委托权限的角色中的步骤,创建向 Auto Scaling 授予访问通知目标的权限的 IAM 角色。当系统提示您选择角色类型时,请选择 AWS Service RolesAutoScaling Notification Access。记下角色的 ARN。例如:arn:aws:iam::123456789012:role/my-notification-role

  3. 当 Auto Scaling 响应扩展或收缩事件时,它将实例置于等待状态。当实例处于等待状态时,Auto Scaling 会向通知目标发布消息。消息包含以下事件数据:

    • LifecycleActionToken — 生命周期操作令牌。

    • AccountId — AWS 账户 ID。

    • AutoScalingGroupName — Auto Scaling 组的名称。

    • LifecycleHookName — 生命周期钩子的名称。

    • EC2InstanceId — EC2 实例的 ID。

    • LifecycleTransition — 生命周期钩子类型。

    例如:

    Service: AWS Auto Scaling
    Time: 2016-09-30T20:42:11.305Z
    RequestId: 18b2ec17-3e9b-4c15-8024-ff2e8ce8786a
    LifecycleActionToken: 71514b9d-6a40-4b26-8523-05e7ee35fa40
    AccountId: 123456789012
    AutoScalingGroupName: my-asg
    LifecycleHookName: my-hook
    EC2InstanceId: i-0598c7d356eba48d7
    LifecycleTransition: autoscaling:EC2_INSTANCE_LAUNCHING
    NotificationMetadata: null

使用 Amazon SQS 接收通知

您可以使用 Amazon SQS 设置通知目标以便在生命周期操作开始时接收通知。

使用 Amazon SQS 设置通知

  1. 使用 Amazon SQS 创建目标。有关更多信息,请参阅 Amazon Simple Queue Service 开发人员指南 中的 Amazon SQS 入门。记下目标的 ARN。

  2. 使用 IAM 用户指南 中的创建向 AWS 服务委托权限的角色中的步骤,创建向 Auto Scaling 授予访问通知目标的权限的 IAM 角色。当系统提示您选择角色类型时,请选择 AWS Service RolesAutoScaling Notification Access。记下角色的 ARN。例如:arn:aws:iam::123456789012:role/my-notification-role

  3. 当 Auto Scaling 响应扩展或收缩事件时,它将实例置于等待状态。当实例处于等待状态时,Auto Scaling 会向通知目标发布消息。

添加生命周期钩子

您可以使用 put-lifecycle-hook 命令创建生命周期挂钩。

要执行扩大操作,请使用以下命令:

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

要执行缩小操作,则请使用以下命令:

Copy
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 接收通知,可使用其他选项。例如,添加以下选项可将 SNS 主题指定为通知目标:

Copy
--notification-target-arn arn:aws:sns:us-west-2:123456789012:my-sns-topic \ --role-arn arn:aws:iam::123456789012:role/my-notification-role

Auto Scaling 将向使用以下键/值对的主题发送测试通知:

"Event": "autoscaling:TEST_NOTIFICATION"

完成生命周期钩子

当 Auto Scaling 响应扩大或缩小事件时,它会将实例置于等待状态并发送任意通知。在您完成生命周期钩子后,Auto Scaling 会继续启动或终止过程。

完成周期钩子

  1. 当实例处于等待状态时,您可以执行自定义操作。有关更多信息,请参阅 准备通知

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

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

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

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

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

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

    Copy
    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 组。Auto Scaling 会启动 EC2 实例,您将在数分钟内收到通知。

使用控制台更改所需容量

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

  2. 在导航窗格上的 Auto Scaling 下,选择 Auto Scaling Groups

  3. 选择您的 Auto Scaling 组。

  4. Details 选项卡上,选择 Edit

  5. 对于 Desired,将当前值增加 1。如果此值超过 Max,还必须将 Max 的值增加 1。

  6. 选择 Save

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