如何在不替换 EC2 实例的情况下更新 CloudFormation 中的 EBS 卷?

1 分钟阅读
0

我想在不替换 Amazon Elastic Compute Cloud(Amazon EC2)实例的情况下更新 AWS CloudFormation 中的 Amazon Elastic Block Store(Amazon EBS)卷。

简短描述

更新 CloudFormation 中的 EBS 卷时,最佳做法是使用 AWS::EC2::Volume 资源类型来防止实例替换。

当您在 AWS::EC2::InstanceAWS::EC2::Template 资源类型的 BlockDeviceMappings 属性中指定卷时,就会发生实例替换。在这种情况下,您必须添加 Retain DeletionPolicy 属性

**先决条件:**如果您将卷从 gp2 修改为 gp3,请确保附加到实例的卷已修改为 gp3。此外,请确保实例未处于 Optimizing(正在优化)或 Modifying(正在修改)状态。在将卷修改为 gp3 之前,请查看限制

**重要提示:**在解决问题之前,请拍摄卷的快照,创建关键工作负载的备份。

解决方法

1.    将 Retain DeletionPolicy 添加到要更新的卷所属实例的 CloudFormation 堆栈,然后更新该堆栈:

AWSTemplateFormatVersion: '2010-09-09'
Resources:
 Myinstance:
  Type: AWS::EC2::Instance
  DeletionPolicy: Retain
  Properties:
   BlockDeviceMappings:
    - DeviceName: /dev/xvda
     Ebs:
      VolumeType: gp2
      VolumeSize: 10
      DeleteOnTermination: true
   EbsOptimized: false
   ImageId: ami-064ff912f78e3e561
   InstanceInitiatedShutdownBehavior: stop
   InstanceType: t2.micro
   Monitoring: false

2.    从模板中删除实例,从而再次更新 CloudFormation 堆栈。**注意:**如果模板中只有一个资源,那么您必须创建替代资源,例如另一个实例。创建之后,您可以从模板中删除资源。

3.    根据您的需求修改 EBS 卷属性。

4.    将实例导回 CloudFormation 堆栈。

要将实例导回 CloudFormation 堆栈,请执行以下操作:

1.    打开 AWS CloudFormation 控制台

2.    在堆栈页面上,选择 Stack actions(堆栈操作),然后选择 Import resources into stack(将资源导入堆栈)。

3.    更新模板:

AWSTemplateFormatVersion: '2010-09-09'
Resources:
 Myinstance:
  Type: AWS::EC2::Instance
  DeletionPolicy: Retain
  Properties: 
   BlockDeviceMappings:
    - DeviceName: /dev/xvda
      Ebs:
       VolumeType: gp3
       VolumeSize: 100
       DeleteOnTermination: true
    EbsOptimized: false
    ImageId: ami-064ff912f78e3e561
    InstanceInitiatedShutdownBehavior: stop
    InstanceType: t2.micro
    Monitoring: false

4.    在 Identifier(标识符)字段中输入实例 ID 值。

5.    选择 Import resource(导入资源)。

CloudFormation 转为 IMPORT_COMPLETE 状态之后,实例就重新归属于堆栈。

**注意:**您可能会收到错误消息:创建此更改集时出错。执行导入操作时,您无法修改或添加 [Outputs]。要解决此问题,请验证最新 CloudFormation 模板与堆栈所用模板在 Outputs(输出)部分是否相同。如果不同,请更新最新的 CloudFormation 模板,与堆栈所用模板的 Outputs(输出)部分的值相一致。然后,再次更新堆栈。


AWS 官方
AWS 官方已更新 2 年前