web-dev-qa-db-ja.com

botoを使用してAWSインスタンスからタグを取得する

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に問題があるかどうかを知っている人はいますか?

18
rodolk

アクセスする前に、「名前」タグが存在することを確認する必要があります。これを試して:

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]
32
andpei

次のようなものを試してください:

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に関連付けられたすべてのタグが出力されます。

4
garnaat

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)
1
nu everest

私のコードではエラーであることが判明しました。 「Name」タグのないインスタンスが1つある場合は考慮しませんでした。

「Name」タグのないインスタンスが1つあり、私のコードはすべてのインスタンスからこのタグを取得しようとしていました。

タグ「Name」のないインスタンスでこのコードを実行すると、

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

KeyError: 'Name'。 vmはAWSインスタンスです。このタグが実際に設定されているインスタンスでは、問題はありませんでした。

あなたの助けをありがとう、それが私自身の間違いだけだったときに尋ねて申し訳ありません。

0
rodolk