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

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

我正在尝试使用 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 快照全新创建。

有一些解决方法:

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

相关内容