web-dev-qa-db-fra.com

Obtention de balises à partir d'instances AWS avec boto

J'essaie d'obtenir des balises à partir d'instances de mon compte AWS à l'aide de la bibliothèque boto de Python.

Bien que cet extrait fonctionne correctement en apportant toutes les balises:

    tags = e.get_all_tags()
    for tag in tags:
        print tag.name, tag.value

(e est une connexion EC2)

Lorsque je demande des tags à des instances individuelles,

    print vm.__dict__['tags']

ou

    print vm.tags

Je reçois une liste vide (vm est en fait une classe d'instance).

Le code suivant:

    vm.__dict__['tags']['Name']

se traduit bien sûr par:

KeyError: 'Name'

Mon code fonctionnait jusqu'à hier et tout à coup, je ne suis pas en mesure d'obtenir les balises d'une instance.

Quelqu'un sait-il s'il y a un problème avec l'API AWS?

18
rodolk

Vous devez être sûr que la balise "Name" existe avant d'y accéder. Essaye ça:

import boto.ec2
conn=boto.ec2.connect_to_region("eu-west-1")
reservations = conn.get_all_instances()
for res in reservations:
    for inst in res.instances:
        if 'Name' in inst.tags:
            print "%s (%s) [%s]" % (inst.tags['Name'], inst.id, inst.state)
        else:
            print "%s [%s]" % (inst.id, inst.state)

imprimera:

i-4e444444 [stopped]
Amazon Linux (i-4e333333) [running]
32
andpei

Essayez quelque chose comme ceci:

import boto.ec2

conn = boto.ec2.connect_to_region('us-west-2')
# Find a specific instance, returns a list of Reservation objects
reservations = conn.get_all_instances(instance_ids=['i-xxxxxxxx'])
# Find the Instance object inside the reservation
instance = reservations[0].instances[0]
print(instance.tags)

Vous devriez voir toutes les balises associées à l'instance i-xxxxxxxx imprimé.

4
garnaat

Pour boto3, vous devrez le faire.

import boto3
ec2 = boto3.resource('ec2')
vpc = ec2.Vpc('<your vpc id goes here>')
instance_iterator = vpc.instances.all()

for instance in instance_iterator:
    for tag in instance.tags:
        print('Found instance id: ' + instance.id + '\ntag: ' + tag)
1
nu everest

Il s'est avéré que c'était une erreur dans mon code. Je n'ai pas considéré le cas d'avoir une seule instance sans la balise "Nom".

Il y avait une instance sans la balise "Nom" et mon code essayait d'obtenir cette balise de chaque instance.

Lorsque j'ai exécuté ce morceau de code dans une instance sans la balise "Nom",

vm.__dict__['tags']['Name']

J'ai eu: KeyError: 'Nom'. vm est une instance AWS. Avec les instances qui avaient réellement cette balise définie, je n'ai eu aucun problème.

Merci pour votre aide et désolé d'avoir demandé quand ce n'était que ma propre erreur.

0
rodolk