Amazon-Ec2

啟動附加了指定 EBS 卷的新 EC2 實例

  • August 29, 2018

我想使用 python boto 庫啟動一個 EC2 實例,並附加一個先前創建的 EBS 卷(除了根卷)。

連接後,我通過名稱標籤查找卷,並嘗試創建包含該卷的塊設備列表。我遇到了各種錯誤,但最終創建了以下程式碼,至少成功啟動了一個實例。

volumes=conn.get_all_volumes(filters={'tag:Name':'TestVolume'})
vol=volumes[0]
print repr(vol)

disks=ec2.blockdevicemapping.BlockDeviceMapping()
xvdf=ec2.blockdevicemapping.BlockDeviceType(volume_id=vol.id,
   size=vol.size,volume_type=vol.type)
disks['/dev/xvdf']=xvdf

base_image="ami-9a562df2" #ubuntu 14.04
reservation=conn.run_instances(
   base_image,
   instance_type="t2.micro",
   block_device_map=disks)

列印語句顯示它能夠查找卷並報告正確的捲 ID。但是,當實例啟動時,會創建一個新的未格式化的 32GB 卷並將其附加到該卷。

我很難找到說明這一點的文件。將特定 EBS 卷添加到 block_device_map 的正確方法是什麼?

無法啟動附加了現有 EBS 卷的新 EC2 實例。

相反,在新的 EC2 實例啟動後附加您現有的 EBS 卷。你有兩個選擇:

  1. 在實例的初始引導序列期間附加現有的 EBS 卷。使用 cloud init,您可以執行一個附加卷的初始腳本。

http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html

  1. 啟動新的 EC2 實例後,等待它完成啟動,然後從 Python 腳本中附加現有的 EBS 卷。

編輯:根據評論添加了更多詳細資訊。

所有各種語言 SDK 都呼叫基本 AWS API。查看基本 AWS API 文件RunInstances

http://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html

在該命令上,有一個BlockDeviceMapping參數,如果您遵循它的資料結構,則不包括卷 ID 屬性。

我不熟悉 Python SDK,但 SDK 可能會重載BlockDeviceMapping該類以表示啟動規範(不允許卷 ID)和正在執行的實例的映射(可以包括卷 ID) .

我通常使用適用於 .NET 的 AWS 開發工具包,而且我很少參考特定的文件。我通常參考基本 API 文件(就像我上面提到的),然後我“找到”在 .NET SDK 中使用的適當方法。但如果存在差異,我認為基本 API 文件是正確的。

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