我想在不替换 Amazon Elastic Compute Cloud(Amazon EC2)实例的情况下更新 AWS CloudFormation 中的 Amazon Elastic Block Store(Amazon EBS)卷。
简短描述
更新 CloudFormation 中的 EBS 卷时,最佳做法是使用 AWS::EC2::Volume 资源类型来防止实例替换。
当您在 AWS::EC2::Instance 和 AWS::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(输出)部分的值相一致。然后,再次更新堆栈。