使用CloudFormation创build具有现有EBS卷的新EC2实例作为根设备

我正尝试使用CloudFormation将现有卷挂载到新的EC2 Windows实例。 这似乎应该是可能的。

大图片

我有供应商提供AMI,它安装了一些预configuration的软件。 我们希望创build一个实例,并且偶尔会更改EC2实例大小以进行性能testing。 我们不想丢失从AMI创build的单个EBS磁盘上的数据。

由于我们使用的是CloudFormation,如果我们简单地更改AWS :: EC2 :: Instance.InstanceType属性并上传已修改的堆栈,CloudFormation将从AMI中新build一个实例和卷。 这没有帮助,因为我们将丢失从现有磁盘上传的数据。

卷方法

我先试了这个脚本。

WindowsVolume: Type: AWS::EC2::Volume Properties: AutoEnableIO: true AvailabilityZone: "ap-southeast-2b" Encrypted: true Size: 30 SnapshotId: snap-0008f111111111 Tags: - Key: Name Value: Ref: AWS::StackName VolumeType: gp2 EC2Instance: Type: AWS::EC2::Instance InstanceType: t2.micro ImageId: ami-663bdc04 # Windows Server stock image KeyName: removed IamInstanceProfile: removed InstanceInitiatedShutdownBehavior: stop SecurityGroupIds: Fn::Split: [",", "Fn::ImportValue": StackName-ServerSecurityGroup] SubnetId: !ImportValue StackName-Subnet1 Volumes: - Device: "/dev/sda1" VolumeId: Ref: WindowsVolume 

我收到了错误信息

对于unixDevice,值“/ dev / sda1”无效。 连接点/ dev / sda1已在使用中

BlockDeviceMappings方法

接下来我尝试使用BlockDeviceMappings

 BlockDeviceMappings: - DeviceName: "/dev/sda1" Ebs: Ref: WindowsVolume 

这次的错误信息是

财产价值Ebs必须是一个客体

VolumeAttachment方法

我也尝试使用VolumeAttachment而不是Volumes属性或BlockDeviceMapping。

 VolAttach: Type: AWS::EC2::VolumeAttachment Properties: Device: "/dev/sda1" InstanceId: !Ref EC2Instance VolumeId: !Ref WindowsVolume 

这给了我和上面一样的信息

对于unixDevice,值“/ dev / sda1”无效。 连接点/ dev / sda1已在使用中

关键问题

有没有人成功将现有的根卷或快照挂载到新的EC2实例? 如果可能的话,什么是正确的方法?

备用方法

很高兴听到替代方法。 例如,我考虑的选项是:

  • 使用CloudFormation创buildVPC和相关资源,然后使用控制台手动创build实例。
  • 使用CloudFormation创buildVPC,相关资源和EC2实例。 从这一点停止使用CloudFormation,只需使用Web控制台来更改实例大小。

启动EC2实例时,无法挂载现有的EBS卷。

启动EC2实例时,EBS卷将始终从AMI的关联EBS快照中新build。

有一些解决方法:

  1. 启动后,停止EC2实例,分离默认的EBS卷,附加所需的卷,然后重新启动实例。
  2. 将您需要的数据存储在辅助EBS卷上。 然后,作为Cloud Init启动的一部分,将该卷附加到您的EC2实例。
  3. 调整CloudFormation之外的实例大小。