如何在AWS上请求临时实例时附加现有EBS卷?
我在使用boto,代码是这样的:
dev_xvdb = boto.ec2.blockdevicemapping.EBSBlockDeviceType(volume_id='vol-xxxxxx')
bdm = boto.ec2.blockdevicemapping.BlockDeviceMapping()
bdm['/dev/xvdb'] = dev_xvdb
rs = ec2.request_spot_instances(price=MY_MAX_PRICE,
image_id='ami-xxxxx',
count=1,
type='one-time',
key_name='MY_KEY_NAME',
security_groups=['default'],
instance_type='t1.micro',
block_device_map=bdm)
这段代码可以正常运行,但就是无法连接EBS卷(id=vol-xxxxxx)。这是为什么呢?
1 个回答
3
我觉得这里的问题是,你不能通过BlockDeviceMapping把一个已经存在的存储卷连接到一个实例上。BlockDeviceMapping让你可以指定一个存储卷的大小或者一个快照的ID。如果你指定了大小,它会创建一个新的、空白的存储卷,并把它连接到你指定的设备上。如果你指定了快照的ID,它会根据那个快照创建一个新的存储卷并连接上去。
如果你想把一个已经存在的存储卷连接到一个实例上,你需要使用attach_volume
这个方法,而这个方法只能在你有了实例ID之后才能使用。
那么你可能会问,为什么boto的EBSBlockDeviceType会有一个volume_id
属性呢?这是因为当我们调用get_all_instances
时,AWS返回的BlockDeviceMapping数据中包含了当前连接的EBS存储卷的volume_id
。