如何从boto安装快照?

时间:2013-06-15 22:36:39

标签: amazon-web-services boto

我使用的是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;?

2 个答案:

答案 0 :(得分:1)

attach_volume方法需要instance_idvolume_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

我希望通过在通常使用的套装之外使用固定名称,我可以避免担心这种愚蠢。