了解使用 Lambda 创建自定义终止策略。 - Amazon A EC2 uto Scaling

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

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

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

在本主题中,您将学习如何使用 Amazon A EC2 uto Scaling 为响应某些事件而调用的 AWS Lambda 函数来创建自定义终止策略。您创建的 Lambda 函数会处理 Amazon A EC2 uto Scaling 发送的输入数据中的信息,并返回准备终止的实例列表。

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

输入数据

Amazon A EC2 uto Scaling 会生成用于扩展事件的JSON有效负载,当实例由于最长实例生命周期或实例刷新功能而即将终止时,也会生成有效负载。它还会为事件的规模生成JSON有效负载,在跨可用区域重新平衡您的群组时可以启动这些负载。

此有效负载包含有关 Amazon A EC2 uto 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 资源名称 (ARN) 和以下元素:

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

  • Instances表示 Amazon A EC2 uto Scaling 根据中的信息建议终止的实例CapacityToTerminate

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

以下信息概述了 Amazon A EC2 uto Scaling 如何生成输入数据的最重要因素:Instances

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

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

响应数据

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

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

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

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

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

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

{ "InstanceIDs": [ ] }

注意事项

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

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

  • 如果未返回任何实例,或者您的 Lambda 函数超时,Amazon A EC2 uto Scaling 会稍等片刻,然后再再次调用您的函数。对于任何横向缩减事件,只要组的所需容量小于其当前容量,它就会继续尝试。例如,基于刷新的终止,它会持续尝试一个小时。之后,如果它继续无法终止任何实例,则实例刷新操作将失败。在最长实例寿命的情况下,Amazon A EC2 uto Scaling 会不断尝试终止被确定为超过其最长生命周期的实例。

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

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

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

创建 Lambda 函数

首先创建 Lambda 函数,这样您就可以在 Auto Scaling 组的终止策略中指定其亚马逊资源名称 (ARN)。

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

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

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

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

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

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

  7. 选择部署

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

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

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

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

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

    1. 选择AWS 账户

    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有关更多信息,请参阅 更改自动扩缩组的终止策略

注意

有关可用作开发 Lambda 函数的参考的示例,请参阅 Amazon A EC2 uto Scal GitHub ing 的存储库

限制

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

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

  • 不能使用ARN带有$LATEST后缀的限定词。如果您尝试添加引用ARN带有$LATEST后缀的限定项的自定义终止策略,则会导致错误。

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

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

  • 如果您的运行时间超出 2 秒的限制,则任何横向缩减操作都将处于暂停状态,直到运行时间降至该阈值以下。对于运行时间始终较长的 Lambda 函数,请找到一种缩短运行时间的方法,例如将结果缓存到其可在后续 Lambda 调用期间进行检索的位置。