从嵌套的dict aws响应中获取键和值

时间:2017-01-27 11:18:08

标签: python amazon-web-services aws-sdk boto3

我努力想要了解嵌套的词汇,以及如何从中获取关键词和价值。

我有一个很好的脚本,可以从我的AWS账户中获取VPC信息:

import boto3
from pprint import pprint

#Declaring some resources for the below scripts. 
ec2 = boto3.resource('ec2')
client = boto3.client('ec2')

#Grabing the VPC information and printing to console. 
filters = [{'Name':'tag:Name', 'Values':['*']}]
vpcs = list(ec2.vpcs.filter(Filters=filters))

for vpc in vpcs:
    response = client.describe_vpcs(
        VpcIds=[
            vpc.id,
        ]
    )
    pprint(response['Vpcs'])
    print('-------')

输出如下:

[{' CidrBlock':' 666.666.0.0/66',' DhcpOptionsId':' 55555',&# 39; InstanceTenancy':'默认',' IsDefault':False,' State':' available',' Tags& #39;:[{' Key':' Environment',' Value':' dev.aws'}, {' Key':' Name',' Value':' dev.aws.co.uk'}],' VpcId& #39;:' vpc-755555'}]

现在我想要的只是抓住VpcId和标签,我尝试了多种pprint变体(响应[' Vpcs'] [" VpcId"])。我已经在网上搜索并尝试了一些变化,但我似乎无法理解它

有谁能对我的例子提出任何建议吗?

更新: 再次感谢你能帮助解决后续问题吗?

我现在尝试将其置于for循环中,这样我就可以获取可能存在于AWS账户中的任何VPC和结果标记的输出,但是使用" TypeError:string indices必须是整数"

我试过的代码(很多变种):

  for vpcs in client.describe_vpcs():
    vpcid = vpcs['Vpcs'][0]['VpcId']
    print("Vpc Id:" + vpcid)

    for vpcs in client.describe_vpcs()['Vpcs']:
        print("VPC ID: " + vpcs['VpcId'])
        print(response['Vpcs'][0]['Tags'])
        print("Tags: " + vpcs['Tags'][0])

任何想法?

更新2:

此循环有效并将使用第一个VPC的标签打印出我的VPC:

for vpcs in client.describe_vpcs()['Vpcs']:
    print("VPC ID: " + vpcs['VpcId'])
    print(response['Vpcs'][0]['Tags'])

我试图让它用VPC id循环标记。

print(client.describe_vpcs())的输出:

{'ResponseMetadata': {'RequestId': 'nnnnn-e323-nn-a9a3-254nnnn2c3b6', 'RetryAttempts': 0, 'HTTPHeaders': {'transfer-encoding': 'chunked', 'content-type': 'text/xml;charset=UTF-8', 'vary': 'Accept-Encoding', 'server': 'AmazonEC2', 'date': 'Fri, 27 Jan 2017 14:21:58 GMT'}, 'HTTPStatusCode': 200}, 'Vpcs': [{'State': 'available', 'IsDefault': True, 'CidrBlock': '172.31.0.0/16', 'DhcpOptionsId': 'dopt-1d555578', 'VpcId': 'vpc-85555eb', 'InstanceTenancy': 'default', 'Tags': [{'Value': 'Default VPC', 'Key': 'Name'}]}, {'State': 'available', 'IsDefault': False, 'CidrBlock': '172.22.0.0/16', 'DhcpOptionsId': 'dopt-1d55558', 'VpcId': 'vpc-255554d', 'InstanceTenancy': 'default', 'Tags': [{'Value': 'DEV', 'Key': 'Environment'}, {'Value': 'dev2.aws.co.uk', 'Key': 'Name'}]}, {'State': 'available', 'IsDefault': False, 'CidrBlock': '172.30.0.0/16', 'DhcpOptionsId': 'dopt-16666d78', 'VpcId': 'vpc-7666617', 'InstanceTenancy': 'default', 'Tags': [{'Value': 'dev.aws', 'Key': 'Environment'}, {'Value': 'dev.aws.co.uk', 'Key': 'Name'}]}]}

修复:

import boto3
client = boto3.client('ec2')

#This is the VPC ID and Linked Tags
for vpctags in client.describe_vpcs()['Vpcs']: 
    print("VPC ID: ", vpctags['VpcId']) 
    print("Tags: ", vpctags['Tags'])

非常感谢MYGz花时间提供帮助。

1 个答案:

答案 0 :(得分:4)

你需要:

vpcid = response['Vpcs'][0]['VpcId']
        # ^dict    ^key  ^item  ^ key in dictionary
        #                at 0th
        #                position 
        #            (which is a dict)

tags = response['Vpcs'][0]['Tags']

response['Vpcs']返回一个列表。此列表仅包含1个元素。该1个元素是包含所需条目'VpcId'

的字典

通过键访问与字典中的键对应的值。列表中的值可以通过索引位置访问。

例如:

要访问'k4'并在下面的词典中获取值'v4'

a={'k1': [{'k2': [{'k3': 'v3' }, {'k4': 'v4'}] }]}

你必须这样做:

a['k1'][0]['k2'][1]['k4']