2016-09-23 1 views
0

J'ai le code suivant en utilisant boto.ec2 pour me connecter à Amazon EC2 à partir de python, mais j'ai du mal à gérer les fichiers .pem. Si je passe None à l'appel run_instances comme nom de clé, je peux créer des instances sans problème. Toutefois, si je passe un nom clé (si je crée à l'aide de la console, ou manuellement comme ci-dessous), je reçois systématiquement l'erreur suivante lorsque je tente d'exécuter une instanceCréation d'instances EC2 avec des paires de clés dans Boto2

EC2ResponseError: 400 Bad Request 
<?xml version="1.0" encoding="UTF-8"?> 
<Response><Errors><Error><Code>InvalidKeyPair.NotFound</Code><Message>The key pair 'newkey.pem' does not exist</Message></Error></Errors><RequestID>e4da5b1e-a8ec-42fb-b3ce-20aa883a0615</RequestID></Response> 

Quand je vérifie sur la console pour la région appropriée, la clé est en effet créée (elle est également créée dans mon répertoire personnel, mais je reçois toujours la clé n'existe pas d'erreur)

Des idées?

Ci-dessous mon actuel code de test Python

try: 
    key_res = conn.get_all_key_pairs(keynames=[key])[0] 
    print key_res 
    print "Key pair found" 
    except boto.exception.EC2ResponseError, e: 
    print e 
    if e.code == 'InvalidKeyPair.NotFound': 
    print 'Creating keypair: %s' % key 
    # Create an SSH key to use when logging into instances. 
    key_aws = conn.create_key_pair(key) 
    # AWS will store the public key but the private key is 
    # generated and returned and needs to be stored locally. 
    # The save method will also chmod the file to protect 
    # your private key. 
    key_aws.save(".") 
    else: 
     raise 
    print "Creating instances" 
    try: 
     conn.run_instances(ami[c.region.name], key_name=key,instance_type=instance,security_groups=[security_group]) 
    except Exception as e: 
       print e 
       print "Failed to create instance in " + c.region.name 
+1

Je semble me souvenir des problèmes avec les noms de clés se terminant par '.pem', en essayant de supprimer le' .pem' et juste se référer à la clé comme 'newkey'. – AChampion

+0

Je passe dans "newkey" seulement l'erreur renvoie "newkey.pem" – user1018513

Répondre

1

Ce code (dérivé de la vôtre) a fonctionné pour moi:

>>> import boto.ec2 
>>> conn = boto.ec2.connect_to_region('ap-southeast-2') 
>>> key_res = conn.get_all_key_pairs(keynames=['class'])[0] 
>>> key_res 
KeyPair:class 
>>> key_res.name 
u'class' 
>>> conn.run_instances('ami-ced887ad', key_name=key_res.name, instance_type='t1.micro', security_group_ids=['sg-94cb39f6']) 
Reservation:r-0755a9700e3886841 

J'ai ensuite essayé votre code clé de création:

>>> key_aws = conn.create_key_pair('newkey') 
>>> key_aws.save(".") 
True 
>>> conn.run_instances('ami-ced887ad', key_name=key_aws.name,instance_type='t1.micro',security_group_ids=['sg-93cb39f6']) 
Reservation:r-07f831452bf869a14 
>>> conn.run_instances('ami-ced887ad', key_name='newkey',instance_type='t1.micro',security_group_ids=['sg-93cb39f6']) 
Reservation:r-0476ef041ed26a52f 

Il semble bien fonctionner!

+0

Il échoue pour moi avec la même erreur :( – user1018513

+0

Êtes-vous sûr que vous utilisez la dernière version de boto? Avez-vous essayé le code comme je l'ai utilisé ci-dessus ('key_name = key_aws.name')? –