我正在尝试使用 CloudFormation 将现有卷安装到新的 EC2 Windows 实例。这似乎应该是可能的。
大图
我有一个供应商提供的 AMI,它安装了一些预配置的软件。我们想要创建一个实例,并且我们会偶尔更改 EC2 实例大小以进行性能测试。我们不想丢失我们将从 AMI 创建的单个 EBS 磁盘上的数据。
由于我们使用的是 CloudFormation,如果我们简单地更改 AWS::EC2::Instance.InstanceType 属性并上传修改后的堆栈 CloudFormation 将从 AMI 中获得一个新实例和卷。这没有帮助,因为我们会丢失从现有磁盘上传的数据。
体积法
我首先尝试了这个脚本。
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 而不是 Volumes 属性或 BlockDeviceMapping。
VolAttach:
Type: AWS::EC2::VolumeAttachment
Properties:
Device: "/dev/sda1"
InstanceId: !Ref EC2Instance
VolumeId: !Ref WindowsVolume
这给了我与上面相同的信息
unixDevice 的值“/dev/sda1”无效。连接点 /dev/sda1 已在使用中
关键问题
有没有人成功地将现有的根卷或快照挂载到新的 EC2 实例?如果可能的话,正确的方法是什么?
替代方法
很高兴听到其他方法。例如,我考虑过的选项是:
- 使用 CloudFormation 创建 VPC 和相关资源,然后使用控制台手动创建实例。
- 使用 CloudFormation 创建 VPC、相关资源和 EC2 实例。从那时起停止使用 CloudFormation,只需使用 Web 控制台更改实例大小。
启动 EC2 实例时无法挂载现有的 EBS 卷。
启动 EC2 实例时,将始终从 AMI 的关联 EBS 快照中重新创建 EBS 卷。
有一些解决方法: