Obtaining tags from AWS instances with boto

rodolk picture rodolk · Oct 22, 2013 · Viewed 42.6k times · Source

I'm trying to obtain tags from instances in my AWS account using Python's boto library.

While this snippet works correctly bringing all tags:

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

(e is an EC2 connection)

When I request tags from individual instances,

    print vm.__dict__['tags']

or

    print vm.tags

I'm getting an empty list (vm is actually an instance class).

The following code:

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

of course results in:

KeyError: 'Name'

My code was working until yesterday and suddenly I'm not able to get the tags from an instance.

Does anybody know whether there is a problem with AWS API?

Answer

andpei picture andpei · Oct 25, 2013

You have to be sure that the 'Name' tag exists before accessing it. Try this:

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)

will print:

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