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

私が何を間違えたのか手がかりがありません。デバイス名は任意であると想定していますが、アタッチ呼び出しはプロセスの一部としてデバイスを作成しますか? または、デバイスはすでに存在していますか?

「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メソッドは と を取りますinstance_idvolume_id、オブジェクトを渡しています。これを試して:

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

device_name、使用している OS の妥当なデバイス名である必要があります。その値の詳細については、こちらを参照してください

boto は標準の Python ロギングを使用するため、必要に応じてログを記録するように構成できます。この要点は、完全なデバッグ ログを取得するためのショートカット アプローチを示しています。ただし、boto はアクセスできるものしかログに記録できず、EC2 からの応答が多くの情報を提供しない可能性があります。

于 2013-06-15T22:58:35.537 に答える