我正在尝试使用 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 方法
我也尝试过使用 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 控制台即可更改实例大小。
答案1
启动 EC2 实例时无法挂载现有的 EBS 卷。
启动 EC2 实例时,EBS 卷将始终根据 AMI 关联的 EBS 快照全新创建。
有一些解决方法:
- 启动后,停止您的 EC2 实例,分离默认 EBS 卷,附加所需的卷,然后重新启动该实例。
- 将所需数据存储在辅助 EBS 卷上。然后作为 Cloud Init 启动的一部分,将该卷附加到您的 EC2 实例。
- 在 CloudFormation 之外调整实例大小。