amazon-web-services - CloudFormation / CDK:如何更换 EC2 实例并保留 EBS 存储?
问题描述
使用 AWS CDK,可以像这样创建带有附加 EBS 的 EC2 实例:
BlockDevice durableStorage = BlockDevice.builder()
.deviceName("/dev/sdf")
.volume(BlockDeviceVolume.ebs(
DURABLE_STORAGE_GB,
EbsDeviceOptions.builder()
.deleteOnTermination(false)
.encrypted(true)
.volumeType(EbsDeviceVolumeType.GP2)
.build()))
.build();
Instance instance = new Instance(
this,
"MyInstance",
InstanceProps.builder()
.blockDevices(List.of(durableStorage))
// more config here
.build());
如果堆栈更新涉及更换 EC2 实例,如何管理 EBS 附件?旧实例会一直保留到新实例创建完成,然后才会销毁,那么应该如何管理 EBS 卷到新服务器的传输呢?这会在 CloudFormation 中进行管理吗?
解决方案
那么应该如何管理 EBS 卷到新服务器的传输呢?这会在 CloudFormation 中进行管理吗?
它没有管理。需要更换实例(例如 AMI id 更改)的更新将失败并显示以下错误消息:
不支持更新资源类型 AWS::EC2::VolumeAttachment。
处理此问题的一种方法是分阶段进行更新。首先,您删除模板中的附件(只需将其注释掉)并更新堆栈以将实例与卷分离。然后你对你的实例进行替换更新。最后,您取消注释附件并再次更新。这会导致将卷重新附加到新实例。
ps
我根据我在 CloudFormation 中为这个问题所做的这个特定场景的快速实验写了这个答案。也许有更好的方法,我目前不知道。
推荐阅读
- html - Ionic 4 自定义弹出框、模态组件或页面样式
- python - 从视图中,我如何将上下文和注册表单传递给我的注册模板?
- r - 将列添加到 df 这是一个函数的输出,该函数使用不同的列值组合为向量输入
- cucumber - 使用黄瓜与子黄瓜测试交互
- excel - 如何选择突出显示的列表框项目以添加到文本框
- r - 如何提取一起变化的变量?
- angular - 有没有办法在 Angular 7 中编码 base62 字符串?
- javascript - 查询特定的 GET 字段?
- oracle - Oracle 事务提交
- python - 将函数应用于小数据帧:形状不匹配:形状 (4,) 的值数组无法广播