在实例刷新期间更换根卷 - Amazon EC2 Auto Scaling
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

在实例刷新期间更换根卷

工作原理

根卷替换通过在保持实例运行的同时仅替换根 EBS 卷来更新您的实例。这样就无需启动新实例,也避免了潜在的容量限制。此过程会保留所有其他实例资源,包括:

  • 网络接口和 IP 地址

  • 非根 EBS 卷

  • 实例存储卷和数据

  • 安全组和 IAM 角色

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

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

  1. ReplacingRootVolume-开始更换根卷

  2. ReplacingRootVolume:Wait-等待生命周期挂钩完成(如果已配置)

  3. ReplacingRootVolume:Proceed-继续进行更换

  4. RootVolumeReplaced-成功完成更换

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

要求

  • 您的 Auto Scaling 组必须使用混合实例策略

  • 混合实例策略中的所有替代项都必须指定 ImageId

  • AMIs 必须只包含一个根卷

  • 所有实例都必须与该组的启动模板配置相匹配

  • 您必须使用包含ImageId替代项的混合实例策略的所需配置开始实例刷新。

使用 “替换根卷” 开始实例刷新

使用 “替换根卷” (Amazon CLI) 开始刷新实例

使用以下start-instance-refresh命令从启动实例刷新 Amazon CLI。您可以在 JSON 配置文件中指定要更改的任何首选项。引用配置文件时,请提供该文件的路径和名称,如以下示例所示。

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

config.json 的内容:

{ "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 } }

如果不提供首选项,则会使用默认值。有关更多信息,请参阅 了解实例刷新的默认值

输出示例:

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

限制

  • 如果 EC2 Auto Scaling 组或所需的实例刷新配置使用$Latest$Default启动模板版本,则无法使用替换根卷启动实例刷新。

  • 如果 Amazon EC2 Auto Scaling 组包含的实例类型不在混合实例策略中,则无法使用替换根卷启动实例刷新。

  • 在使用 Replace Root Volume 刷新实例期间,您只能连接所需配置的混合实例策略中存在的类型的实例。

  • 在具有温池的 EC2 Auto Scaling 组上,您无法使用替换根卷来启动实例刷新。

  • 您无法使用替换根卷向具有活动实例刷新的 Amazon EC2 Auto Scaling 组添加温池。

使用生命周期挂钩替换根卷

正在更换根卷的实例会遵循自己的生命周期过渡,允许您在替换 and/or 后调用操作(例如 Lambda 函数)。有关根卷更换期间生命周期状态的更多信息,请参阅正在更换根卷的实例的生命周期状态转换

有关添加生命周期钩子的更多信息,请参阅 向自动扩缩组添加生命周期挂钩。有关完成生命周期操作的更多信息,请参阅 在自动扩缩组中完成生命周期操作

在替换根卷之前,生命周期挂钩可能在以下情况下很有用:

  • 在更换根卷和重启实例之前,您希望优雅地关闭应用程序。

  • 您想在更换卷之前将数据从根卷移动到其他位置。

更换根卷后,生命周期挂钩在以下情况下可能很有用:

  • 在开始接收流量之前,您需要验证您的实例是否已完全准备好使用新 AMI。

  • 你想引导以前存在于根卷上的应用程序数据。

添加生命周期钩子时,请考虑以下事项:

  • 为生命周期操作配置autoscaling:EC2_INSTANCE_TERMINATING生命周期挂钩后,即将进行根卷更换的实例在进入ReplacingRootVolume:Wait状态时会暂停以执行自定义操作。

  • 为生命周期操作配置autoscaling:EC2_INSTANCE_LAUNCHING生命周期挂钩时,刚刚替换了根卷的实例在进入Pending:Wait状态时会暂停执行自定义操作。

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

本指南的 EventBridge 部分提供了这些通知的示例。有关更多信息,请参阅 实例刷新替换根卷生命周期事件