啟動附加了指定 EBS 卷的新 EC2 實例
我想使用 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 卷。你有兩個選擇:
- 在實例的初始引導序列期間附加現有的 EBS 卷。使用 cloud init,您可以執行一個附加卷的初始腳本。
http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html
- 啟動新的 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 文件是正確的。