2016-08-26 3 views
2

В настоящее время я использую AWS Boto3, чтобы попытаться получить список всех моих текущих экземпляров EC2. Я нахожусь в точке, где я могу использовать describe_instances для перечисления всех моих экземпляров, но я пытаюсь выяснить, как вытащить все идентификаторы экземпляра, чтобы я мог их распечатать и использовать их для другой части скрипта. В конечном счете, у меня есть один сценарий, который закручивает весь экземпляр, а затем я хочу, чтобы он их разрывал.Распечатать все подходящие словари JSON в Python

JSON Дерево ребра.

Чтобы выбрать, специфические один, я должен сделать это,

instance_id = response['Reservations'][0]['Instances'][0]['InstanceId'] 

Но я хочу, чтобы иметь возможность выбрать все экземпляры, независимо от того, сколько экземпляров у меня есть, так что пытается сделать [0] [ 1] и т. Д. Нецелесообразно, поэтому не уверен, как бы я сказал, что хочу, чтобы каждый экземпляр InstanceId находился в команде.

{ 
    u'Reservations': [ 
     { 
      u'Groups': [ 

      ], 
      u'Instances': [ 
       { 
        u'AmiLaunchIndex': 0, 
        u'Architecture': 'i386', 
        u'EbsOptimized': False, 
        u'Hypervisor': 'xen', 
        u'InstanceId': 'i-6fb4ad61', 
       } 
      ], 
      u'OwnerId': '', 
      u'ReservationId': '' 
     }, 
     { 
      u'Groups': [ 

      ], 
      u'Instances': [ 
       { 
        u'AmiLaunchIndex': 0, 
        u'Architecture': 'i386', 
        u'EbsOptimized': False, 
        u'Hypervisor': 'xen', 
        u'InstanceId': 'i-afe3faa1', 
       } 
      ], 
      u'OwnerId': '', 
      u'ReservationId': '' 
     } 
    ], 
    'ResponseMetadata': { 
     'HTTPHeaders': { 
      'content-type': 'text/xml;charset=UTF-8', 
      'date': 'Thu, 25Aug201623: 44: 09GMT', 
      'server': 'AmazonEC2', 
      'transfer-encoding': 'chunked', 
      'vary': 'Accept-Encoding' 
     }, 
     'HTTPStatusCode': 200, 
     'RequestId': '' 
    } 
} 

Вот команда, которую я использую, чтобы получить идентификатор экземпляра.

launch_instance = ec2.create_instances(ImageId="xxxxxx", MinCount=1, MaxCount=1,SecurityGroupIds=["sg-xxxxxxx"],InstanceType='m3.medium', SubnetId='subnet-xxxxx') 


response = ec2client.describe_instances(
    InstanceIds=[ 
     launch_instance[0].id], 
) 

instance_id = response['Reservations'][0]['Instances'][0]['InstanceId'] 

print instance_id 

выход я-6fb4ad61

ответ

2

Попробуйте

instance_ids = [] 
for reservations in response['Reservations']: 
    for instance in reservations['Instances']: 
     instance_ids.append(instance['InstanceId']) 
+0

Я получаю это в ipython 'AttributeError:' dict 'объект не имеет атрибута' append '' – Mallachar

+0

@Mallachar извините, я сделал опечатку :(Я обновил свой ответ –

+0

А-а, отлично, спасибо вы, это сработало! – Mallachar

2

Вы можете достичь это с помощью:

>>> instance_ids = [instance['InstanceId'] for reservations in response['Reservations'] for instance in reservations['Instances']] 
>>> instance_ids 
['i-6fb4ad61', 'i-afe3faa1'] 

где ваша JSON структура сохраняется как response

+0

I получить T ypeError: строковые индексы должны быть целыми числами – Mallachar

+0

Я только что обновил его. Попробуйте сейчас –

+0

работал отлично, спасибо! – Mallachar