

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

# 配置 Amazon EC2 Auto Scaling 的终止策略
<a name="ec2-auto-scaling-termination-policies"></a>

终止策略提供 Amazon EC2 Auto Scaling 在按特定顺序终止实例时所遵循的标准。默认情况下，Amazon EC2 Auto Scaling 使用终止策略，该策略旨在首先终止使用过时配置的实例。您可以更改终止策略以控制哪些实例最需要优先终止。

当 Amazon EC2 Auto Scaling 终止实例时，它将尝试在为自动扩缩组启用的可用区之间保持平衡。保持区域平衡优先于终止策略。如果一个可用区的实例多于其他可用区，则 Amazon EC2 Auto Scaling 首先将终止策略应用于不平衡的区域。如果可用区保持平衡，则会在所有区域中应用终止策略。

**Topics**
+ [默认终止策略的工作原理](#default-termination-policy)
+ [默认终止策略和混合实例组](#default-termination-policy-mixed-instances-groups)
+ [预定义的终止策略](#predefined-termination-policies)
+ [更改自动扩缩组的终止策略](custom-termination-policy.md)

**注意**  
Amazon EC2 Auto Scaling 仅对未被 Auto Scaling 组视为不健康的实例应用终止策略。因此，被 Auto Scaling 运行状况检查标记为不健康的实例将绕过终止策略评估。  
有关更多信息，请参阅 [设计您的应用程序以妥善处理实例终止](gracefully-handle-instance-termination.md)。

## 默认终止策略的工作原理
<a name="default-termination-policy"></a>

当 Amazon EC2 Auto Scaling 需要终止实例时，它首先确定哪些可用区具有最多的实例，以及至少一个不受横向缩减保护的实例。然后，它继续评估已确定的可用区内未受保护的实例，如下所示：

**使用过时配置的实例**
+ **对于使用启动模板的组**：确定任何实例是否使用过时的配置，按照以下顺序确定优先级：

  1. 首先，检查实例是否使用启动配置启动。

  1. 然后，检查实例是否使用其他启动模板而不是当前启动模板启动。

  1. 最后，检查实例是否使用当前启动模板的最旧版本。
+ **对于使用启动配置的组**：确定是否有任何实例使用最旧的启动配置。

如果未找到有过时配置的实例，或有多个实例可供选择，则 Amazon EC2 Auto Scaling 会考虑下一个标准，即接近下一个计费小时的实例。

**接近下一个计费小时的实例**  
确定符合先前标准的任何实例是否最接近下一个计费小时。如果多个实例同样接近，则随机终止一个实例。这有助于最大限度使用按小时计费的实例。但是，现在大多数 EC2 使用量按秒计费，因此这种优化带来的好处较少。有关更多信息，请参阅 [Amazon EC2 定价](https://aws.amazon.com/ec2/pricing/)。

以下流程图说明默认终止策略如何适用于使用启动模板的组。

![\[演示自动扩缩组如何使用默认终止策略终止实例的流程图。\]](http://docs.aws.amazon.com/zh_cn/autoscaling/ec2/userguide/images/termination-policy-default-flowchart-diagram.png)


## 默认终止策略和混合实例组
<a name="default-termination-policy-mixed-instances-groups"></a>

在终止[混合实例组](ec2-auto-scaling-mixed-instances-groups.md)中的实例时，Amazon EC2 Auto Scaling 会应用额外的标准。

当 Amazon EC2 Auto Scaling 需要终止实例时，其首先确定应根据组设置终止哪个购买选项（竞价型还是按需型）。这样可以确保该组内的竞价型实例和按需型实例随着时间的推移倾向于指定的比率。

然后，其将在每个可用区内独立应用终止策略。其可确定终止哪个可用区中的哪个竞价型实例或按需型实例，以保持可用区平衡。同样的逻辑适用于为实例类型定义了权重的混合实例组。

在每个区域内，默认终止策略的工作原理如下，用于确定可以终止购买选项中哪些不受保护的实例：

1. 确定是否可以终止任何实例，以提高与自动扩缩组指定[分配策略](allocation-strategies.md)的一致性。如果没有确定要优化的实例，或者有多个实例可供选择，则会继续评估。

1. 确定任何实例是否使用过时的配置，按照以下顺序确定优先级：

   1. 首先，检查实例是否使用启动配置启动。

   1. 然后，检查实例是否使用其他启动模板而不是当前启动模板启动。

   1. 最后，检查实例是否使用当前启动模板的最旧版本。

   如果未找到有过时配置的实例，或者有多个实例可供选择，则会继续评估。

1. 确定是否有任何实例最接近下一个计费小时。如果多个实例同样接近，则随机选择一个实例。

## 预定义的终止策略
<a name="predefined-termination-policies"></a>

您可以从以下预定义的终止策略中进行选择：
+ **`Default`**：根据默认终止策略终止实例。
+ **`AllocationStrategy`**：终止自动扩缩组中的实例，使剩余实例与所终止实例类型（竞价型实例或按需型实例）的分配策略匹配。当您首选的实例类型发生变化时，可使用该策略。如果竞价分配策略是 `lowest-price`，则您可以逐渐在 N 个最低价竞价池中重新平衡分布竞价型 实例。如果竞价分配策略是 `capacity-optimized`，则您可以逐渐重新平衡具有更多可用竞价容量的竞价池之间 竞价型实例的分布。您也可以使用较高优先级类型的按需实例逐渐替代较低优先级类型的按需实例。
+ **`OldestLaunchTemplate`**：终止采用最旧启动模板的实例。利用此策略，会首先终止使用非当前启动模板的实例，然后终止使用当前启动模板的最旧版本的实例。如果要更新某个组并且逐步淘汰先前配置中的实例时，此策略非常有用。
+ **`OldestLaunchConfiguration`**：终止采用最旧启动配置的实例。如果要更新某个组并且逐步淘汰先前配置中的实例时，此策略非常有用。使用此策略，使用非当前启动配置的实例将首先终止。
+ **`ClosestToNextInstanceHour`**：终止最接近下个计费小时的实例。此策略有助于最大限度使用按小时收费的实例。
+ **`NewestInstance`**：终止组中最新的实例。如果要测试新的启动配置但不想在生产中保留它时，此策略非常有用。
+ **`OldestInstance`**：终止组中最旧的实例。当您将 Auto Scaling 组中的实例升级为新的 EC2 实例类型，此选项十分有用。您可以逐渐将较旧类型的实例替换为较新类型的实例。
**注意**  
Amazon EC2 Auto Scaling 始终首先在可用区间平衡实例，无论使用何种终止策略。因此，您可能会遇到一些较新的实例在旧实例之前终止的情况。例如，当某个可用区的实例数多于该组使用的其他可用区时，或某个可用区的实例数多于该组使用的其他可用区。

# 更改自动扩缩组的终止策略
<a name="custom-termination-policy"></a>

要更改自动扩缩组的终止策略，请使用以下方法之一。

------
#### [ Console ]

首次在 Amazon EC2 Auto Scaling 控制台中创建自动扩缩组时，您无法更改终止策略。默认终止策略被自动使用。创建自动扩缩组后，您可以将默认策略替换为不同的终止策略或按其应有的应用顺序列出的多个终止策略。

**更改自动扩缩组的终止策略**

1. 在上打开 Amazon EC2 控制台 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)，然后从导航窗格中选择 A **uto Scaling Gro** ups。

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

   这时将在页面底部打开一个拆分窗格。

1. 在 **Details**（详细信息）选项卡上，选择 **Advanced configurations**（高级配置）、**Edit**（编辑）。

1. 对于 **Termination policies**（终止策略），请选择一个或多个终止策略。如果您选择多个策略，请按照您希望评估策略的顺序将其列出。

   您还可选择 **Custom termination policy**（自定义终止策略），然后选择一个满足您需求的 Lambda 函数。如果您已经为 Lambda 函数创建了版本和别名，则可以从 **Version/Alias**（版本/别名）下拉列表选择版本或别名。要使用您的 Lambda 函数的未发布版本，请保留 **Version/Alias**（版本/别名）设置为默认值。有关更多信息，请参阅 [了解使用 Lambda 创建自定义终止策略。](lambda-custom-termination-policy.md)。
**注意**  
使用多个策略时，必须正确设置它们的顺序：  
如果您使用 **Default**（默认）策略，它必须是列表中的最后一个策略。
如果您使用 **Custom termination policy**（自定义终止策略），它必须是列表中的第一个策略。

1. 选择 **Update**（更新）。

------
#### [ AWS CLI ]

自动使用默认终止策略，除非指定了不同的策略。

**更改自动扩缩组的终止策略**  
使用以下命令之一：
+ [create-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/create-auto-scaling-group.html)
+ [update-auto-scaling-group](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/update-auto-scaling-group.html)

您可以单独使用终止策略，或者将它们合并到策略列表中。例如，使用以下命令更新 Auto Scaling 组以首先使用 `OldestLaunchConfiguration` 策略，然后使用 `ClosestToNextInstanceHour` 策略。

```
aws autoscaling update-auto-scaling-group --auto-scaling-group-name my-asg --termination-policies "OldestLaunchConfiguration" "ClosestToNextInstanceHour"
```

如果您使用 `Default` 终止策略，请将该策略设为终止策略列表中的最后一项。例如 `--termination-policies "OldestLaunchConfiguration" "Default"`。

要使用自定义终止政策，必须先使用创建终止政策 AWS Lambda。要指定要用作终止策略的 Lambda 函数，请将其设为终止策略列表中的第一个函数。例如 `--termination-policies "arn:aws:lambda:us-west-2:123456789012:function:HelloFunction:prod" "OldestLaunchConfiguration"`。有关更多信息，请参阅 [了解使用 Lambda 创建自定义终止策略。](lambda-custom-termination-policy.md)。

------