

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

# 在实例刷新期间更换根卷
<a name="replace-root-volume"></a>

**Topics**
+ [工作原理](#start-instance-refresh-replace-root-volume-how-it-works)
+ [要求](#start-instance-refresh-replace-root-volume-requirements)
+ [使用 “替换根卷” 开始实例刷新](#start-instance-refresh-replace-root-volume-cli)
+ [限制](#start-instance-refresh-replace-root-volume-limitations)
+ [使用生命周期挂钩替换根卷](#replace-root-volume-lifecycle-hooks)

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

根卷替换通过在保持实例运行的同时仅替换根 EBS 卷来更新您的实例。这样就无需启动新实例，也避免了潜在的容量限制。此过程会保留所有其他实例资源，包括：
+ 网络接口和 IP 地址 
+ 非根 EBS 卷 
+ 实例存储卷和数据 
+ 安全组和 IAM 角色 

在更换根卷期间，您的应用程序将继续在现有实例上运行。将分离原始根卷，从您指定的 AMI 创建新的根卷，然后连接到同一个实例。成功替换后，原始根卷将自动删除。

当您使用替换根卷策略时，实例会经历以下生命周期状态：

1. `ReplacingRootVolume`-开始更换根卷

1. `ReplacingRootVolume:Wait`-等待生命周期挂钩完成（如果已配置）

1. `ReplacingRootVolume:Proceed`-继续进行更换

1. `RootVolumeReplaced`-成功完成更换

根卷替换完成后，Auto Scaling 会对更新的实例进行运行状况检查。如果某个实例的根卷更换失败，Auto Scaling 会将该实例标记为终止，并将其替换为新实例。

## 要求
<a name="start-instance-refresh-replace-root-volume-requirements"></a>
+ 您的 Auto Scaling 组必须使用混合实例策略
+ 混合实例策略中的所有替代项都必须指定 `ImageId` 
+ AMIs 必须只包含一个根卷
+ 所有实例都必须与该组的启动模板配置相匹配
+ 您必须使用包含`ImageId`替代项的混合实例策略的所需配置开始实例刷新。

## 使用 “替换根卷” 开始实例刷新
<a name="start-instance-refresh-replace-root-volume-cli"></a>

**使用 “替换根卷” (AWS CLI) 开始刷新实例**  
使用以下[start-instance-refresh](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/autoscaling/start-instance-refresh.html)命令从启动实例刷新 AWS CLI。您可以在 JSON 配置文件中指定要更改的任何首选项。引用配置文件时，请提供该文件的路径和名称，如以下示例所示。

```
aws autoscaling start-instance-refresh --cli-input-json file://config.json
```

`config.json` 的内容：

**Example**  

```
{
  "AutoScalingGroupName": "my-asg",
  "Strategy" : "ReplaceRootVolume",
  "DesiredConfiguration":{
    "MixedInstancesPolicy":{
      "LaunchTemplate": {
        "LaunchTemplateSpecification": {
          "LaunchTemplateId":"my-launch-template",
          "Version": "1"
        },
        "Overrides": [
          {
            "InstanceType":"c5.large",
            "ImageId":"ami-1234example"
          },
          {
            "InstanceType":"m5.large",
            "ImageId":"ami-2345example"
          }
        ]
      }
    }
  },
  "Preferences": {
    "InstanceWarmup": 60,
    "MinHealthyPercentage": 90,
    "AutoRollback": true,
    "ScaleInProtectedInstances": Ignore,
    "StandbyInstances": Ignore
  }
}
```

如果不提供首选项，则会使用默认值。有关更多信息，请参阅 [了解实例刷新的默认值](understand-instance-refresh-default-values.md)。

输出示例：

```
{
    "InstanceRefreshId": "08b91cf7-8fa6-48af-b6a6-d227f40f1b9b"
}
```

## 限制
<a name="start-instance-refresh-replace-root-volume-limitations"></a>
+ 如果 EC2 Auto Scaling 组或所需的实例刷新配置使用`$Latest`或`$Default`启动模板版本，则无法使用替换根卷启动实例刷新。
+ 如果 Amazon EC2 Auto Scaling 组包含的实例类型不在混合实例策略中，则无法使用替换根卷启动实例刷新。
+ 在使用 Replace Root Volume 刷新实例期间，您只能连接所需配置的混合实例策略中存在的类型的实例。
+ 在具有温池的 EC2 Auto Scaling 组上，您无法使用替换根卷来启动实例刷新。
+ 您无法使用替换根卷向具有活动实例刷新的 Amazon EC2 Auto Scaling 组添加温池。

## 使用生命周期挂钩替换根卷
<a name="replace-root-volume-lifecycle-hooks"></a>

正在更换根卷的实例会遵循自己的生命周期过渡，允许您在替换 and/or 后调用操作（例如 Lambda 函数）。有关根卷更换期间生命周期状态的更多信息，请参阅[正在更换根卷的实例的生命周期状态转换](lifecycle-hooks-overview.md#rvr-lifecycle-state-transitions)。

有关添加生命周期钩子的更多信息，请参阅 [向自动扩缩组添加生命周期挂钩](adding-lifecycle-hooks.md)。有关完成生命周期操作的更多信息，请参阅 [在自动扩缩组中完成生命周期操作](completing-lifecycle-hooks.md)。

在替换根卷之前，生命周期挂钩可能在以下情况下很有用：
+ 在更换根卷和重启实例之前，您希望优雅地关闭应用程序。
+ 您想在更换卷之前将数据从根卷移动到其他位置。

更换根卷后，生命周期挂钩在以下情况下可能很有用：
+ 在开始接收流量之前，您需要验证您的实例是否已完全准备好使用新 AMI。
+ 你想引导以前存在于根卷上的应用程序数据。

添加生命周期钩子时，请考虑以下事项：
+ 为生命周期操作配置`autoscaling:EC2_INSTANCE_TERMINATING`生命周期挂钩后，即将进行根卷更换的实例在进入`ReplacingRootVolume:Wait`状态时会暂停以执行自定义操作。
+ 为生命周期操作配置`autoscaling:EC2_INSTANCE_LAUNCHING`生命周期挂钩时，刚刚替换了根卷的实例在进入`Pending:Wait`状态时会暂停执行自定义操作。

当实例达到等待状态时，Amazon EC2 Auto Scaling 将发送通知。Auto Scaling 生命周期挂钩通知包含一个`Action`字段，其值`ReplaceRootVolume`表示实例正在更换根卷。

本指南的 EventBridge 部分提供了这些通知的示例。有关更多信息，请参阅 [实例刷新替换根卷生命周期事件](instance-refresh-eventbridge-events.md#instance-refresh-rvr-lifecycle-events)。