我正在使用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”中的第一个元素,但是我不知道如何获取其他ID。如果我在未指定[0]的情况下进行尝试,则会收到list indices must be integers or slices, not str
错误。我也尝试使用字典而不是列表,但感觉就像是用那棵树吠叫一样。任何建议/帮助将不胜感激!
答案 0 :(得分:1)
一个可能的答案,不是特别pythonic
...
id_list = []
volumes_data = instance["BlockDeviceMappings"]
for element in volumes_data:
id_list.append(element["Ebs"]["VolumeId"])
否则使用json.loads,然后使用.get语法(如final answer in this
遍历json)