使用附加的指定EBS卷启动新的EC2实例

我想用python boto库启动一个EC2实例,并附带一个以前创build的EBS卷(除了根卷之外)。

连接后,我通过名称标签查找卷,然后尝试创build包含卷的块设备列表。 我得到各种错误,但最终创build了下面的代码,至less成功地启动实例。

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) 

打印语句显示它能够查找卷并报告正确的卷标识。 但是,当实例启动时,将创build一个新的未格式化的32GB卷,并将其连接到该卷。

我很难find明确的文档。 将特定EBS卷添加到block_device_map的正确方法是什么?

无法启动附加了现有EBS卷的新EC2实例。

相反,在新的EC2实例启动之后附加您的现有EBS卷。 你有两个select:

  1. 在您的实例的初始引导顺序期间附上现有的EBS卷。 使用云初始化,你有一个初始脚本运行,附加音量。

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

  1. 启动新的EC2实例后,等待它启动完毕,然后从Python脚本中附加现有的EBS卷。

编辑:添加更多的细节根据意见。

所有各种语言的SDK都调用基础的AWS API。 查看RunInstances的基础AWS API文档:

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

在该命令中,有一个BlockDeviceMapping参数,如果您遵循它的数据结构,则不包含卷ID属性。

我对Python SDK并不熟悉,但是SDK可能会重载BlockDeviceMapping类来表示启动规范(不允许使用卷标识)和运行实例的映射(可以包含卷ID )。

我通常使用适用于.NET的AWS开发工具包,因此我很less参考特定的文档。 我经常参考基础API文档(就像我上面提到的那样),然后“find”在.NET SDK中使用的适当方法。 但是,如果存在差异,我认为基本API文档是正确的。