20

我正在尝试使用 Python 的 boto 库从我的 AWS 账户中的实例获取标签。

虽然此代码段可以正常工作,但会带来所有标签:

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

(e 是 EC2 连接)

当我从单个实例请求标签时,

    print vm.__dict__['tags']

或者

    print vm.tags

我得到一个空列表(vm 实际上是一个实例类)。

以下代码:

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

当然会导致:

KeyError: 'Name'

我的代码一直工作到昨天,突然我无法从实例中获取标签。

有人知道 AWS API 是否有问题吗?

4

4 回答 4

34

在访问它之前,您必须确保存在“名称”标签。试试这个:

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)

将打印:

i-4e444444 [stopped]
Amazon Linux (i-4e333333) [running]
于 2013-10-25T10:44:26.993 回答
4

尝试这样的事情:

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)

您应该会看到与实例关联的所有标签都i-xxxxxxxx打印出来了。

于 2013-10-22T16:47:28.507 回答
1

对于 boto3,您将需要这样做。

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)
于 2016-02-17T18:24:37.833 回答
0

原来是我的代码中的一个错误。我没有考虑有一个实例没有标签“名称”的情况。

有一个实例没有标签“名称”,我的代码试图从每个实例中获取这个标签。

当我在没有标签“名称”的实例中运行这段代码时,

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

我得到:KeyError:'名称'。vm 是一个 AWS 实例。对于实际设置了此标签的实例,我没有任何问题。

感谢您的帮助,很抱歉问这只是我自己的错误。

于 2013-10-29T14:28:06.433 回答