2013-06-15 5 views
1

Я использую boto 2.5.1, Python 2.7, Ubuntu Precise. Я хочу установить моментальный снимок на экземпляр EC2. Я дошел до создания тома из моментального снимка, но потом не могу понять, как его прикрепить. Если я:Как смонтировать снимок от boto?

[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 

без подсказки о том, что я сделал неправильно. Я предполагаю, что имя устройства является произвольным, и приложенный вызов создаст устройство как часть процесса? Или устройство уже существует?

Как я могу получить более полезную диагностику, чем просто «плохой запрос»?

ответ

1

Метод attach_volume принимает instance_id и volume_id, но вы проходите мимо объектов. Попробуйте это:

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

device_name должно быть разумное имя устройства для операционной системы, которую вы используете. Вы можете узнать больше о том, что это значение должно быть here.

boto использует стандартное ведение журнала Python, поэтому вы можете настроить его на запись столько или меньше, сколько хотите. В этом gist показан подход с ярлыком для получения полного журнала отладки. Тем не менее, boto может регистрировать только то, к чему он имеет доступ, и, возможно, ответ от EC2 просто не предоставляет много информации.

+0

Я должен был быть более ясным. Я передаю строки, а не объекты. –

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 

Я надеялся, что с помощью фиксированного имени вне множества, которое обычно используется, я мог бы избежать того, чтобы беспокоиться об этом глупость.

Смежные вопросы