我使用的是boto 2.5.1,Python 2.7,Ubuntu Precise。我想在EC2实例上安装快照。我已经从快照创建了一个卷,但后来我无法弄清楚如何附加它。如果我这样做:
[setup stuff elided]
c = EC2Connection()
print volume
print instance
c.attach_volume(volume, instance, "/dev/snap")
我得到了令人惊讶的无益例外:
vol-2df00677
i-1509d364
Traceback (most recent call last):
File "./mongo_pulldown.py", line 48, in <module>
main()
File "./mongo_pulldown.py", line 28, in main
c.attach_volume(volume, instance, "/dev/snap")
File "/home/roy/deploy/current/python/local/lib/python2.7/site-packages/boto/ec2/connection.py", line 1530, in attach_volume
return self.get_status('AttachVolume', params, verb='POST')
File "/home/roy/deploy/current/python/local/lib/python2.7/site-packages/boto/connection.py", line 985, in get_status
raise self.ResponseError(response.status, response.reason, body)
boto.exception.EC2ResponseError: EC2ResponseError: 400 Bad Request
不知道我做错了什么。我假设设备名称是任意的,并且附加调用将创建设备作为过程的一部分?或者设备是否已经存在?
我怎样才能获得一些更有用的诊断,而不仅仅是&#34;错误的请求&#34;?
答案 0 :(得分:1)
attach_volume
方法需要instance_id
和volume_id
,但您传递的是对象。试试这个:
c.attach_volume(volume.id, instance.id, "/dev/sdh")
device_name
应该是您正在使用的操作系统的合理设备名称。您可以找到有关该值应为here的更多信息。
boto使用标准的Python日志记录,因此您可以根据需要将其配置为尽可能多地记录。此gist显示了获取完整调试日志记录的快捷方法。但是,boto只能记录它有权访问的内容,并且EC2的响应可能不会提供太多信息。
答案 1 :(得分:1)
嗯,事实证明我传达了一些不好的设备。我正在传递'/ dev / snap'。当我把它改成'xvdg'时,事情很有效。似乎'/ dev / xvdg'也有效(并且具有相同的效果;'/ dev /'部分似乎被忽略)。
我写了一个小函数来查找下一个可用的未使用设备名称:
def get_device_name():
for c in 'fghijklmnop':
name = "xvd%s" % c
path = "/dev/%s" % name
try:
os.stat(path)
except OSError:
return path
我希望通过在通常使用的套装之外使用固定名称,我可以避免担心这种愚蠢。