2017-01-20 2 views
1

Я хочу, чтобы получить идентификатор тома блочного устройства (не корень устройства) экземпляра под названием «приложение»:Получить идентификатор тома блочного устройства ec2 например

ec2client = session.client('ec2') 
response = ec2client.describe_instances(Filters=[{'Name': 'tag-key', 'Values': ['application'] },]) 

Как я могу извлечь Идентификатор от ответа? Я знаю, что идентификатор тома в синтаксисе ответа:

'BlockDeviceMappings': [ 
         { 
          'DeviceName': 'string', 
          'Ebs': { 
           'VolumeId': 'string', 
           'Status': 'attaching'|'attached'|'detaching'|'detached', 
           'AttachTime': datetime(2015, 1, 1), 
           'DeleteOnTermination': True|False 
          } 
         }, 
        ], 

Я попытался это:

for r in response['Reservations']: 
    for i in r['Instances']: 
    print i['InstanceId'], i['Hypervisor'] 
    for b in i['BlockDeviceMappings']: 
     print b['Ebs']['VolumeId'] 

Но я ничего не получаю .. ничего не печатает.

ответ

1

Если вы просто спрашивают, как получить доступ к словарю, это как:

from datetime import datetime 
response = {'Reservations': [{'Instances':[{'BlockDeviceMappings': [ 
         { 
          'DeviceName': 'Dev1', 
          'Ebs': { 
           'VolumeId': 'Vol1', 
           'Status': 'attaching', 
           'AttachTime': datetime(2015, 1, 1), 
           'DeleteOnTermination': True|False 
          } 
         }, 
         { 
          'DeviceName': 'Dev2', 
          'Ebs': { 
           'VolumeId': 'Vol2', 
           'Status': 'attaching', 
           'AttachTime': datetime(2015, 1, 1), 
           'DeleteOnTermination': True|False 
          } 
         }, 
        ], 
      'other_key': 'other data'}]}]} 


out = [] 
for reservation in response['Reservations']: 
    for instance in reservation['Instances']: 
     out += [device['Ebs']['VolumeId'] for device in instance['BlockDeviceMappings']] 
print out 

# outputs ['Vol1', 'Vol2'] 

Я обобщил свой вопрос немного, чтобы обрабатывать случай, когда возвращается более одного устройства. Если вы знаете, что у вас есть только одно устройство, вы можете просто использовать response['BlockDeviceMappings'][0]['Ebs']['VolumeId'].

Другой способ сделать это состоит в использовании AWS CLI и jq: `ответ

$ aws ec2 describe-instances | jq -c ".Reservations|.[0]|.Instances|.[0]|.BlockDeviceMappings|.[0]|.Ebs|.VolumeId"` 
+0

спасибо, когда я использую печати [ 'BlockDeviceMappings'] [0] [ 'Ebs'] [ 'VolumeId'] ', который дает мне' KeyError: 'BlockDeviceMappings' ' – JavaQueen

+0

Можете ли вы« отпечатать ответ »? Я сделал предположение, что вы показываете весь словарь ответов. –

+0

Это то, что дает ответ «print response»: '{u'Reservations ': [],' ResponseMetadata ': {' HTTPStatusCode ': 200,' RequestId ':' 4984584h-1681-403d-850b-db0eb4a99da2 ',' HTTPHeaders ': {' transfer-encoding ':' chunked ',' vary ':' Accept-Encoding ',' server ':' AmazonEC2 ',' content-type ':' text/xml; charset = UTF-8 ',' date ':' Fri, 20 Jan 2017 14:14:53 GMT '}}} ' – JavaQueen

Смежные вопросы