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

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

使用 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": "OnDemand" }, { "AvailabilityZone": "us-east-1b", "Capacity": 1, "InstanceMarketOption": "Spot" }, { "AvailabilityZone": "us-east-1c", "Capacity": 3, "InstanceMarketOption": "OnDemand" } ], "Instances": [ { "AvailabilityZone": "us-east-1b", "InstanceId": "i-0056faf8da3e1f75d", "InstanceType": "t2.nano", "InstanceMarketOption": "OnDemand" }, { "AvailabilityZone": "us-east-1c", "InstanceId": "i-02e1c69383a3ed501", "InstanceType": "t2.nano", "InstanceMarketOption": "OnDemand" }, { "AvailabilityZone": "us-east-1c", "InstanceId": "i-036bc44b6092c01c7", "InstanceType": "t2.nano", "InstanceMarketOption": "OnDemand" }, ... ], "Cause": "SCALE_IN" }

该负载包括 Auto Scaling 组的名称、其 Amazon 资源名称 (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 函数时返回的实例数超过所需数量,则 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 组的终止策略中指定其亚马逊资源名称 (ARN)。

创建 Lambda 函数(控制台)

  1. 打开Function Conunction在 Lambda 控制台上。

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

  3. 选择创建函数从头开始创作.

  4. Ulper基本信息, 用于函数名称中,输入函数的名称。

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

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

  7. 选择 Deploy (部署)

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

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

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

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

    5. 选择 Save

  13. 在遵循以上说明操作后,继续 Auto Scaling 下一步。有关更多信息,请参阅 使用不同的终止策略 (Amazon CLI)

Limitations

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

  • Amazon EC2 Auto Scaling 控制台尚不支持在终止策略中指定 Lambda 函数。您必须使用Amazon CLI或 SDK,在 Auto Scaling 组的终止策略中指定 Lambda 函数。

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

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

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

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

  • Amazon EC2 Auto Scaling 不会终止启用实例扩展保护的实例。