首页 > 解决方案 > 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 中进行管理吗?

标签: amazon-web-servicesamazon-ec2amazon-cloudformationaws-cdk

解决方案


那么应该如何管理 EBS 卷到新服务器的传输呢?这会在 CloudFormation 中进行管理吗?

它没有管理。需要更换实例(例如 AMI id 更改)的更新失败并显示以下错误消息:

不支持更新资源类型 AWS::EC2::VolumeAttachment。

处理此问题的一种方法是分阶段进行更新。首先,您删除模板中的附件(只需将其注释掉)并更新堆栈以将实例与卷分离。然后你对你的实例进行替换更新。最后,您取消注释附件并再次更新。这会导致将卷重新附加到新实例。

ps

我根据我在 CloudFormation 中为这个问题所做的这个特定场景的快速实验写了这个答案。也许有更好的方法,我目前不知道。


推荐阅读