1

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

不知道我做错了什么。我假设设备名称是任意的,并且附加调用将创建设备作为过程的一部分?还是该设备已经存在?

我怎样才能获得比“错误请求”更有用的诊断信息?

4

2 回答 2

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

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

于 2013-06-15T23:50:48.050 回答
1

attach_volume方法需要 ainstance_id和 avolume_id但您正在传递对象。尝试这个:

c.attach_volume(volume.id, instance.id, "/dev/sdh")

device_name应该是您正在使用的操作系统的合理设备名称。您可以在此处找到有关该值的更多信息。

boto 使用标准的 Python 日志记录,因此您可以将其配置为尽可能多地或尽可能少地记录。此要点显示了获取完整调试日志记录的快捷方法。但是,boto 只能记录它可以访问的内容,并且来自 EC2 的响应可能只是没有提供太多信息。

于 2013-06-15T22:58:35.537 回答