使用 Python 访问嵌套的 JSON [AWS 元数据]



我正在使用 Lambda 运行我的 AWS 账户,返回所有实例的列表。我需要能够打印出所有"VolumeId"值,但我无法弄清楚如何访问它们,因为它们是嵌套的。我能够打印出每个实例的第一个VolumeId,但是,有些实例有多个卷,有些只有一个卷。我想我知道为什么我会得到这些结果,但我无法弄清楚该怎么做才能让所有这些结果都回来。

下面是一个实例的 JSON 外观片段:

{  
'Groups':[],
'Instances':[  
{  
'AmiLaunchIndex':0,
'ImageId':'ami-0',
'InstanceId':'i-0123',
'InstanceType':'big',
'KeyName':'nonprod',
'LaunchTime':'date',
'Monitoring':{  
'State':'disabled'
},
'Placement':{  
'AvailabilityZone':'world',
'GroupName':'',
'Tenancy':'default'
},
'PrivateDnsName':'secret',
'PrivateIpAddress':'1.2.3.4',
'ProductCodes':[  
],
'PublicDnsName':'',
'State':{  
'Code':80,
'Name':'stopped'
},
'StateTransitionReason':'User initiated',
'SubnetId':'subnet-1',
'VpcId':'vpc-1',
'Architecture':'yes',            
'BlockDeviceMappings':[  
{  
'DeviceName':'/sda',
'Ebs':{  
'AttachTime':'date',
'DeleteOnTermination':True,
'Status':'attached',
'VolumeId':'vol-1'
}
},
{  
'DeviceName':'/sdb',
'Ebs':{    
'AttachTime':'date'),
'DeleteOnTermination':False,
'Status':'attached',
'VolumeId':'vol-2'
}
}
],

这是我为获取第一个 VolumeId 所做的:

ec2client = boto3.client('ec2')
ec2 = ec2client.describe_instances()
for reservation in ec2["Reservations"]:
for instance in reservation["Instances"]:
instanceid = instance["InstanceId"]
volumes = instance["BlockDeviceMappings"][0]["Ebs"]["VolumeId"]
print("The associated volume IDs for this instance are: ",(volumes))

我认为我只得到第一个 ID 的原因是因为我引用了"BlockDeviceMappings"中的第一个元素,但我无法弄清楚如何获取其他元素。如果我在没有指定 [0] 的情况下尝试它,则会出现list indices must be integers or slices, not str错误。我也尝试使用字典而不是列表,但感觉我用那棵树吠错了树。任何建议/帮助将不胜感激!

一个可能的答案,不是特别的pythonic

id_list = []
volumes_data = instance["BlockDeviceMappings"]
for element in volumes_data:
id_list.append(element["Ebs"]["VolumeId"])

或者使用 json.loads,然后使用 .get 语法迭代 json,就像这里的最终答案一样

相关内容

  • 没有找到相关文章

最新更新