如何在AWS上请求临时实例时附加现有EBS卷?

1 投票
1 回答
1308 浏览
提问于 2025-04-17 15:19

我在使用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

撰写回答