Amazon-Web-Services
使用 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 而不是 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 卷。
有一些解決方法:
- 啟動後,停止您的 EC2 實例,分離預設 EBS 卷,附加所需的捲,然後重新啟動實例。
- 將所需數據儲存在輔助 EBS 卷上。然後作為 Cloud Init 啟動的一部分,將該卷附加到您的 EC2 實例。
- 在 CloudFormation 之外調整實例大小。