2013-06-15 2 views
1

J'utilise boto 2.5.1, Python 2.7, Ubuntu Precise. Je veux monter un instantané sur une instance EC2. Je suis allé jusqu'à créer un volume à partir de l'instantané, mais je n'arrive pas à comprendre comment l'attacher. Si je fais:Comment monter un snapshot à partir de boto?

[setup stuff elided] 
c = EC2Connection() 
print volume 
print instance 
c.attach_volume(volume, instance, "/dev/snap") 

Je reçois l'exception incroyablement inutile:

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 

sans la moindre idée de ce que je l'ai fait mal. Je suppose que le nom de périphérique est arbitraire et l'appel de rattachement créera le périphérique dans le cadre du processus? Ou l'appareil a-t-il déjà existé?

Comment puis-je obtenir un diagnostic plus utile qu'une simple "demande incorrecte"?

Répondre

1

La méthode attach_volume prend un instance_id et un volume_id mais vous passez des objets. Essayez ceci:

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

Le device_name doit être un nom de périphérique raisonnable pour le système d'exploitation que vous utilisez. Vous pouvez en savoir plus sur ce que cette valeur devrait être here.

boto utilise la journalisation Python standard pour que vous puissiez le configurer pour qu'il se connecte autant ou aussi peu que vous le souhaitez. Cette gist montre une approche de raccourci pour obtenir la journalisation complète du débogage. Cependant, boto peut uniquement enregistrer ce à quoi il a accès et il est possible que la réponse de EC2 ne fournisse pas beaucoup d'informations.

+0

J'aurais dû être plus clair. Je passe des cordes, pas des objets. –

1

Eh bien, il se trouve que je passais quelque chose de mauvais pour l'appareil. Je passais '/ dev/snap'. Quand j'ai changé cela en 'xvdg', les choses ont fonctionné. Il semble que '/ dev/xvdg' fonctionne aussi (et a le même effet, la partie '/ dev /' semble être ignorée).

j'ai écrit une petite fonction pour trouver le prochain nom de l'appareil inutilisé:

def get_device_name(): 
    for c in 'fghijklmnop': 
     name = "xvd%s" % c 
     path = "/dev/%s" % name 
     try: 
      os.stat(path) 
     except OSError: 
      return path 

J'espérais que, en utilisant un nom fixé à l'extérieur de l'ensemble qui est normalement utilisé, je pourrais éviter d'avoir à se soucier de ce niaiserie.

Questions connexes