Доступ к вложенным JSON [метаданным AWS] с помощью Python - PullRequest
0 голосов
/ 18 июня 2019

Я использую Lambda для запуска через свою учетную запись AWS, возвращая список всех экземпляров. Мне нужно иметь возможность распечатать все значений VolumeId, но я не могу понять, как получить к ним доступ, поскольку они вложены. Я могу распечатать first 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))

Я думаю, причина того, что я получаю только первый идентификатор, заключается в том, что я ссылаюсь на первый элемент в «BlockDeviceMappings», но я не могу понять, как получить другие. Если я попробую это без указания [0], я получу ошибку list indices must be integers or slices, not str. Я тоже пытался использовать словарь вместо списка, но мне показалось, что я ошибся с этим деревом. Будем благодарны за любые предложения / помощь!

1 Ответ

1 голос
/ 18 июня 2019

Один возможный ответ, не особенно питонический

...

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

Или используйте json.loads, а затем выполните итерации, используя json, используя синтаксис .get, такой как окончательный ответ в этом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...