

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

# 自动扩缩组中实例刷新的工作原理
<a name="instance-refresh-overview"></a>

本主题描述了实例刷新的工作原理，并介绍有效使用该功能需要了解的主要概念。

**Topics**
+ [工作原理](#instance-refresh-how-it-works)
+ [核心概念](#instance-refresh-core-concepts)
+ [运行状况检查宽限期](#instance-refresh-health-check-grace-period)
+ [实例类型兼容性](#instance-type-compatibility)
+ [限制](#instance-refresh-limitations)

## 工作原理
<a name="instance-refresh-how-it-works"></a>

要刷新自动扩缩组中的实例，您可以定义一个新配置，其中包含应用程序的最新版本以及您要进行的任何其他更新。

实例刷新支持两种更新实例的策略：
+ **滚动策略（默认）**-根据您的喜好终止实例并分批启动新实例。这可确保您的 Auto Scaling 组在整个更新过程中保持其所需的容量和可用性。
+ **替换根卷策略** — 通过仅替换根卷来更新实例，而不终止实例。这样可以保留实例网络接口、非根 EBS 卷和实例存储数据。

替换根卷策略的要求：
+ 您的 Auto Scaling 组必须使用混合实例策略
+ 混合实例策略中的所有替代项都必须指定 `ImageId` 
+ AMIs 必须只包含一个根卷
+ 所有实例都必须与该组的启动模板配置相匹配
+ 您必须使用包含`ImageId`替代项的混合实例策略的所需配置开始实例刷新。

启用跳过匹配后，Auto Scaling 会将每个实例的当前 AMI ID 与所需配置 IDs 中的 AMI 进行比较。它仅替换 AMI IDs 不匹配的实例，从而允许您跳过已经更新的实例。

### 执行实例刷新
<a name="instance-refresh-process"></a>

开始刷新实例，根据该配置将现有实例替换为新实例。

1. 创建新的启动模板或使用所需配置更改（例如，新的亚马逊机器映像（AMI））更新现有模板。有关更多信息，请参阅 [为 Auto Scaling 组创建启动模板](create-launch-template.md)。

1. 使用 Amazon EC2 Auto Scaling 控制台或软件开发工具包开始实例刷新： AWS CLI
   + 指定新启动模板或您创建的启动模板版本。这将用于启动新实例。
   + 设置首选的最小和最大运行正常百分比。这可以控制同时替换多少个实例，以及是否在终止旧实例之前启动新实例。
   + 配置任何可选设置，例如：
     + **检查点**：在完成一定比例的替换后暂停实例刷新以验证进度。
     + **烘焙时间**：在实例刷新结束时暂停以验证实例的运行状况，在此之后才视为实例刷新已完成。
     + **跳过匹配**：将旧实例与新配置进行比较，仅替换不匹配的实例。当您从控制台开始实例刷新时，默认情况下会开启跳过匹配。
     + **多个实例类型**：作为所需配置的一部分，应用新的或更新的[混合实例策略](ec2-auto-scaling-mixed-instances-groups.md)。

实例刷新开始后，Amazon EC2 Auto Scaling 将：
+ 根据最小和最大运行正常百分比分批替换实例。
+ 如果最小运行正常百分比设置为 100%，则应先启动新实例，然后再终止旧实例。这可确保始终保持所需容量。
+ 检查实例的运行状况，让它们有时间进行预热，然后再替换更多实例。
+ 终止并替换被发现运行状况不佳的实例。
+ 实例刷新成功后，使用新的配置更改自动更新自动扩缩组设置。
+ 先替换 `InService` 实例，然后再替换暖池中的实例。

以下流程图说明了将最小运行正常百分比设置为 100% 时终止前启动的行为。

![\[该图显示当最小运行正常百分比设置为 100% 时实例刷新如何工作。\]](http://docs.aws.amazon.com/zh_cn/autoscaling/ec2/userguide/images/instance-refresh-high-level-flowchart-diagram.png)


**注意**  
仅当您尚未设置实例维护策略或需要覆盖实例维护策略时，才需要指定实例刷新的最小和最大运行正常百分比。有关更多信息，请参阅 [实例维护策略](ec2-auto-scaling-instance-maintenance-policy.md)。  
同样，仅当您尚未启用默认预热或需要覆盖默认预热时，才需要为实例刷新指定实例预热期。有关更多信息，请参阅 [为 Auto Scaling 组设置原定设置实例预热](ec2-auto-scaling-default-instance-warmup.md)。

## 核心概念
<a name="instance-refresh-core-concepts"></a>

在您开始之前，请熟悉以下实例刷新核心概念：

**最低运行正常百分比**  
*最小运行正常百分比*是实例刷新期间保持可用、运行正常且随时可用的所需容量的百分比。例如，如果最低运行正常百分比为 90%，最高运行正常百分比为 100%，那么一次将替换的容量百分比为 10%。如果新的实例未通过运行状况检查，Amazon EC2 Auto Scaling 将终止并替换这些实例。如果实例刷新无法启动任何运行正常的实例，则它最终将失败，使组中其他的 90% 保持不变。如果新的实例保持正常运行并完成其预热期，Amazon EC2 Auto Scaling 可以继续替换其他实例。  
实例刷新可以一次替换一个实例，一次替换多个实例，也可以一次替换全部实例。要一次替换一个实例，请将最低和最高运行正常百分比均设置为 100%。这会将实例刷新的行为更改为在终止之前启动，从而防止组的容量降至其所需容量的 100% 以下。要一次替换全部实例，将最低运行正常百分比设置为 0%。

**最高运行正常百分比**  
*最高运行正常百分比*是替换实例时您的自动扩缩组可以增加到的所需容量的百分比。最小值和最大值之间的差值不能大于 100。范围越大，可以同时替换的实例的数量就会增加。

**实例预热**  
*实例预热*是从新实例的状态变为 `InService` 之时起到其被视为已完成初始化之时止需要经过的时间段。在实例刷新期间，如果实例通过其运行状况检查，确定新启动的实例正常运行后，Amazon EC2 Auto Scaling 不会立即继续进行下一个实例替换。它会等待预热期结束，然后继续替换下一个实例。如果应用程序在响应请求之前仍需要一些初始化时间，此功能可能很有用。  
实例预热与默认实例预热的工作方式相同。因此，同样的扩缩注意事项也适用。有关更多信息，请参阅 [为 Auto Scaling 组设置原定设置实例预热](ec2-auto-scaling-default-instance-warmup.md)。

**所需配置**  
*所需配置*是您希望 Amazon EC2 Auto Scaling 在自动扩缩组中部署的新配置。例如，您可以为实例指定新的启动模板和新的实例类型。在实例刷新期间，Amazon EC2 Auto Scaling 会将 Auto Scaling 组更新为所需配置。如果在实例刷新期间发生向外扩展事件，Amazon EC2 Auto Scaling 将启动具有所需配置而不是该组的当前设置的新实例。实例刷新成功后，Amazon EC2 Auto Scaling 会更新自动扩缩组的设置，以反映您在实例刷新过程中指定的新所需配置。

**跳过匹配**  
跳过匹配将通知 Amazon EC2 Auto Scaling 忽略已有最新更新的实例。这样，您就无需替换超过所需数量的实例。当您希望确保自动扩缩组使用特定版本的启动模板，并且只替换那些使用其他版本的实例时，这是很有用的。

**检查点**  
*检查点*是实例刷新在指定时间内暂停的时间点。实例刷新可以包含多个检查点。Amazon EC2 Auto Scaling 会针对每个检查点发出事件。因此，您可以添加一条 EventBridge 规则，将事件发送到目标（例如 Amazon SNS），以便在到达检查点时收到通知。达到某个检查点后，您将有机会验证您的部署。如果发现任何问题，您可以取消实例刷新，或回滚实例。分阶段部署更新的能力是检查点的一个关键优势。如果不使用检查点，则会持续执行滚动替换。

要详细了解在开始实例刷新时可以配置的所有默认设置，请参阅 [了解实例刷新的默认值](understand-instance-refresh-default-values.md)。

## 运行状况检查宽限期
<a name="instance-refresh-health-check-grace-period"></a>

Amazon EC2 Auto Scaling 会根据您的自动扩缩组所使用的运行状况检查的状态来确定实例是否运行正常。有关更多信息，请参阅 [自动扩缩组中实例的运行状况检查](ec2-auto-scaling-health-checks.md)。

为确保这些运行状况检查尽快开始，请勿将组的运行状况检查宽限期设置得过高，而应设置得足够高，以便 Elastic Load Balancing 运行状况检查确定目标是否可用于处理请求。有关更多信息，请参阅 [设置自动扩缩组的运行状况检查宽限期](health-check-grace-period.md)。

## 实例类型兼容性
<a name="instance-type-compatibility"></a>

在更改实例类型之前，最好验证它是否适用于您的启动模板。这确认了与您指定的 AMI 的兼容性。例如，如果您从半虚拟化（PV）AMI 启动了原始实例，但希望更改为仅受硬件虚拟机（HVM）AMI 支持的最新一代实例类型。在这种情况下，您必须在启动模板中使用 HVM AMI。

要在不启动实例的情况下确认实例类型的兼容性，请使用带 `--dry-run` 选项的 [run-instances](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/run-instances.html) 命令，如以下示例所示。

```
aws ec2 run-instances --launch-template LaunchTemplateName=my-template,Version='1' --dry-run
```

有关如何确定兼容性的信息，请参阅《Amazon EC2 用户指南》**中的[更改实例类型的兼容性](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/resize-limitations.html)。

## 限制
<a name="instance-refresh-limitations"></a>
+ **总持续时间**：实例刷新可继续主动替换实例的最长时间为 14 天。
+ **加权组特有的行为差异**：如果配置混合实例组的实例权重大于或等于该组的所需容量，则 Amazon EC2 Auto Scaling 可能会一次性替换所有 `InService` 实例。为避免这种情况，请遵循 [配置自动扩缩组以使用实例权重](ec2-auto-scaling-mixed-instances-groups-instance-weighting.md) 主题中的建议。指定所需容量，该容量大于在自动扩缩组中使用权重时的最大权重。
+ **一小时超时**：当实例刷新因等待替换备用实例或横向缩减保护实例，或者新实例没有通过运行状况检查而无法继续进行替换时，Amazon EC2 Auto Scaling 将持续重试一个小时。它还将提供状态消息以帮助您解决问题。如果问题在一小时后仍然存在，则操作失败。这样做的目的是在出现临时问题时给它时间恢复。
+ **通过用户数据部署代码**：跳过匹配不会检查通过用户数据脚本部署的代码更改。如果您使用用户数据提取新代码并在新实例上安装这些更新，则建议您关闭跳过匹配功能，以确保所有实例都能收到您的最新代码，即使没有启动模板版本更新也是如此。
+ **更新限制**：如果您在具有所需配置的实例刷新处于活动状态时，尝试更新自动扩缩组的启动模板、启动配置或混合实例策略，则请求将失败，并显示以下验证错误：`An active instance refresh with a desired configuration exists. All configuration options derived from the desired configuration are not available for update while the instance refresh is active.`
+ **基于属性的实例选择**：如果自动扩缩组使用基于属性的实例选择（在混合实例策略中指定 `InstanceRequirements`），则不支持以下实例刷新参数：
  + **SkipMatching**-如果您使用已`InstanceRequirements`配置的 Auto Scaling 组中的`SkipMatching`参数启动实例刷新，则实例刷新将失败。
  + **DesiredConfiguration**-如果您使用已`InstanceRequirements`配置的 Auto Scaling 组中的`DesiredConfiguration`参数启动实例刷新，则实例刷新将失败。

  如果需要对使用基于属性的实例选择的自动扩缩组执行实例刷新，请在不使用这些参数的情况下启动实例刷新。
+ 根卷替换不支持 Elastic Load Balancing。