Amazon-Web-Services

使用 CloudFormation 以現有 EBS 卷作為根設備創建新的 EC2 實例

  • September 9, 2021

我正在嘗試使用 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 卷。

有一些解決方法:

  1. 啟動後,停止您的 EC2 實例,分離預設 EBS 卷,附加所需的捲,然後重新啟動實例。
  2. 將所需數據儲存在輔助 EBS 卷上。然後作為 Cloud Init 啟動的一部分,將該卷附加到您的 EC2 實例。
  3. 在 CloudFormation 之外調整實例大小。

引用自:https://serverfault.com/questions/876942