了解使用 Lambda 创建自定义终止策略。 - Amazon EC2 Auto Scaling
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

了解使用 Lambda 创建自定义终止策略。

Amazon EC2 Auto Scaling 使用终止策略来确定在减小 Auto Scaling 组大小时首先终止哪些实例的优先级(称为缩减)。Auto Scaling 组使用默认终止策略,但您可以选择或创建您自己的终止策略。有关选择预定义终止策略的更多信息,请参阅 为 Amazon EC2 Auto Scaling 配置终止策略

在本主题中,您将了解如何使用 Amazon Lambda 函数创建自定义终止策略,Amazon EC2 Auto Scaling 在响应某些事件时调用该函数。您创建的 Lambda 函数处理 Amazon EC2 Auto Scaling 发送的输入数据中的信息,并返回准备终止的实例列表。

自定义终止策略可以更好地控制终止哪些实例以及何时终止。例如,当 Auto Scaling 组扩展时,Amazon EC2 Auto Scaling 无法确定是否存在不应中断的运行的工作负载。使用 Lambda 函数,您可以验证终止请求并等待工作负载完成后再将实例 ID 返回 Amazon EC2 Auto Scaling 以进行终止。

输入数据

Amazon EC2 Auto Scaling 为扩展事件生成 JSON 有效负载,当实例由于实例最大生命周期或实例刷新功能而终止时,也会生成此负载。它还为在跨可用区重新平衡组时可以启动的扩展事件生成 JSON 有效负载。

此负载包含有关 Amazon EC2 Auto Scaling 需要终止的容量、建议终止的实例列表以及启动终止的事件的信息。

以下是示例负载:

{ "AutoScalingGroupARN": "arn:aws:autoscaling:us-east-1:<account-id>:autoScalingGroup:d4738357-2d40-4038-ae7e-b00ae0227003:autoScalingGroupName/my-asg", "AutoScalingGroupName": "my-asg", "CapacityToTerminate": [ { "AvailabilityZone": "us-east-1b", "Capacity": 2, "InstanceMarketOption": "on-demand" }, { "AvailabilityZone": "us-east-1b", "Capacity": 1, "InstanceMarketOption": "spot" }, { "AvailabilityZone": "us-east-1c", "Capacity": 3, "InstanceMarketOption": "on-demand" } ], "Instances": [ { "AvailabilityZone": "us-east-1b", "InstanceId": "i-0056faf8da3e1f75d", "InstanceType": "t2.nano", "InstanceMarketOption": "on-demand" }, { "AvailabilityZone": "us-east-1c", "InstanceId": "i-02e1c69383a3ed501", "InstanceType": "t2.nano", "InstanceMarketOption": "on-demand" }, { "AvailabilityZone": "us-east-1c", "InstanceId": "i-036bc44b6092c01c7", "InstanceType": "t2.nano", "InstanceMarketOption": "on-demand" }, ... ], "Cause": "SCALE_IN" }

有效负载包括 Auto Scaling 组的名称、其 Amazon Resource Name (ARN) 以及以下元素:

  • CapacityToTerminate 描述了在给定可用区域内设置为终止的竞价或按需容量的大小。

  • Instances 表示 Amazon EC2 Auto Scaling 根据 CapacityToTerminate 信息建议终止的实例。

  • Cause 描述了导致终止的事件:SCALE_ININSTANCE_REFRESHMAX_INSTANCE_LIFETIME 或者 REBALANCE

以下信息概述了 Amazon EC2 Auto Scaling 如何生成Instances输入数据中:

  • 当实例由于扩大事件和基于实例刷新的终止而终止时,保持可用区间的平衡优先。因此,如果某个可用区的实例数多于该组使用的其他可用区,则您的终止策略将应用于不均衡可用区中的实例。如果组使用的可用区是均衡的,则输入数据将包含组的所有可用区中的实例。

  • 使用混合实例策略,则根据您对每个购买选项的所需百分比,维持您的竞价和按需容量的平衡也将优先考虑。我们首先确定应终止两种类型中的哪种类型(竞价或按需)。然后,我们确定哪些实例(在已确定的购买选项内),我们可以终止哪些可用区,这些实例将导致可用区域最平衡。

响应数据

输入数据和响应数据协同工作,以缩小要终止的实例列表。

对于给定的输入,Lambda 函数的响应应类似于以下示例:

{ "InstanceIDs": [ "i-02e1c69383a3ed501", "i-036bc44b6092c01c7", ... ] }

这些区域有:InstanceIDs 表示准备终止的实例。

或者,您可以返回准备终止的一组不同的实例,这些实例将覆盖输入数据中的实例。如果在您的 Lambda 函数被调用时没有任何实例可以终止,您也可以选择不返回任何实例。

没有准备好终止的实例时,Lambda 函数的响应应类似于以下示例:

{ "InstanceIDs": [ ] }

注意事项

注意以下使用自定义终止策略时的注意事项:

  • 首先在响应数据中返回实例并不能保证其终止。如果在调用 Lambda 函数时返回的实例数超过所需数量,则 Amazon EC2 Auto Scaling 会根据您为 Auto Scaling 组指定的其他终止策略评估每个实例。当存在多个终止策略时,它会尝试应用列表中的下一个终止策略,如果实例数量超过了终止所需的实例,则会转到下一个终止策略,依此类推。如果未指定其他终止策略,则使用默认终止策略来确定要终止的实例。

  • 如果没有返回任何实例或您的 Lambda 函数超时,则 Amazon EC2 Auto Scaling 会等待很短的时间,然后再次调用您的函数。对于任何扩展事件,只要组的所需容量小于其当前容量,它就会继续尝试。例如,基于刷新的终止,它会持续尝试一个小时。之后,如果它继续无法终止任何实例,则实例刷新操作将失败。在实例生命周期最长的情况下,Amazon EC2 Auto Scaling 会继续尝试终止被确定为超过其最大生命周期的实例。

  • 由于您的函数会重复重试,因此请确保在使用 Lambda 函数作为自定义终止策略之前测试并修复代码中的任何永久性错误。

  • 如果您使用自己的要终止的实例列表覆盖输入数据,并且终止这些实例会使可用区失去平衡,则 Amazon EC2 Auto Scaling 会逐渐重新平衡跨可用区域的容量分配。首先,它调用你的 Lambda 函数,查看是否有准备终止的实例,以便它可以确定是否开始重新平衡。如果存在可以终止的实例,它会首先启动新实例。当实例完成启动后,它会检测到组的当前容量高于其所需容量,并启动扩展事件。

  • 自定义终止策略不会影响您同时使用横向缩减保护功能来保护某些实例不被终止的能力。有关更多信息,请参阅 实例横向缩减保护

创建 Lambda 函数

首先创建 Lambda 函数,以便您可以在 Auto Scaling 组的终止策略中指定 Amazon Resource Name (ARN)。

要创建 Lambda 函数(控制台)
  1. 打开 Lambda 控制台的 Functions(函数)页面。

  2. 在屏幕顶部的导航栏中,选择您在创建 Auto Scaling 组时使用的同一区域。

  3. 选择 Create function(创建函数),然后选择 Author from scratch(从头开始创作)。

  4. 基本信息下的函数名称中输入函数的名称。

  5. 选择创建函数。返回到函数的代码和配置。

  6. 让函数在控制台中保持打开状态,在函数代码,请将代码粘贴到编辑器中。

  7. 选择部署

  8. 或者,通过选择版本选项卡,然后选择发布新版本,创建 Lambda 函数的发布版本。要了解有关 Lambda 中的版本控制的详细信息,请参阅 Amazon Lambda 开发人员指南中的 Lambda 函数版本

  9. 如果您选择发布版本,在别名选项卡选择是否要将别名与此版本的 Lambda 函数关联。要了解有关 Lambda 中的别名的详细信息,请参阅 Amazon Lambda 开发人员指南中的 Lambda 函数别名

  10. 接下来,选择配置选项卡,然后 Permissions(权限)。

  11. 向下滚动到基于资源的策略,然后选择添加权限。基于资源的策略用于向在策略中指定的委托人授予调用函数的权限。在这种情况下,委托人将是与 Auto Scaling 组关联的 Amazon EC2 Auto Scaling 服务关联角色

  12. 策略语句部分中,配置您的权限:

    1. 选择Amazon Web Services 账户

    2. 适用于委托人中,输入调用服务链接角色的 ARN,例如 arn:aws:iam::<aws-account-id>:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling

    3. 在 “操作” 中,选择 lambda: InvokeFunction

    4. 对于声明 ID,输入唯一的声明 ID,如 AllowInvokeByAutoScaling

    5. 选择保存

  13. 在遵循以上说明操作后,继续作为下一步,在 Auto Scaling 组的终止策略中指定函数的 ARN。有关更多信息,请参阅 更改 Auto Scaling 组的终止策略

注意

有关可用作开发 Lambda 函数的参考的示例,请参阅 Amazon EC2 Auto Sc GitHub aling 的存储库

限制

  • 您只能在 Auto Scaling 组的终止策略中指定一个 Lambda 函数。如果指定了多个终止策略,则必须先指定 Lambda 函数。

  • 您可以使用非限定 ARN(不带后缀)或具有版本或别名作为后缀的限定 ARN 来引用 Lambda 函数。如果使用了不合格的 ARN(例如 function:my-function),您的基于资源的策略必须在函数的未发布版本上创建。如果使用了合格的 ARN(例如 function:my-function:1 或者 function:my-function:prod),您的基于资源的策略必须在函数的未发布版本上创建。

  • 您不能使用后缀为 $LATEST 的合格 ARN。如果您尝试添加引用后缀为 $LATEST 的限定 ARN 的自定义终止策略,它将导致出现错误。

  • 输入数据中提供的实例数量限制为 30,000 个实例。如果可以终止的实例超过 30,000 个,则输入数据将包含 "HasMoreInstances": true 以指示返回的实例的最大数目。

  • Lambda 函数的最长运行时间为两秒(2000 毫秒)。作为最佳实践,您应该根据预期运行时间设置 Lambda 函数的超时值。Lambda 函数的默认超时时间为三秒,但这可以减少。