AWS Python: возвращает значения из ответа

#python #boto3

#python #boto3

Вопрос:

Моя цель — создать лямбда-выражение, которое анализирует ресурсы cloudformation stack drift, а затем выводит список всех групп безопасности, которые были изменены.

Следующее вернет список ВСЕХ измененных ресурсов для определенного стека:

 import boto3

cfn_client = boto3.client('cloudformation')

drifts = cfn_client.describe_stack_resource_drifts(
    StackName='my_stack>',
    StackResourceDriftStatusFilters=[
      'MODIFIED',
    ],
    MaxResults=100
)
  

Который возвращает ответ dict с помощью (я включил только поля, относящиеся к вопросу):

 {
  'ResponseMetadata': {
    'RetryAttempts': 0,
    'HTTPStatusCode': 200,
    'RequestId': '12b1f618-722e-4b08-9534-123',
    'HTTPHeaders': {
      'content-type': 'text/xml',
      'content-length': '118369',
      'vary': 'accept-encoding',
      'date': 'Tue, 18 Aug 2020 11:11:38 GMT'
    }
  },
  u 'StackResourceDrifts': [{
    u 'StackId': 'arn:aws:cloudformation:eu-west-1:12345678:stack/my_stack/12345,
    u 'ResourceType': 'AWS::EC2::SecurityGroup',
    u 'PhysicalResourceId': 'sg-987654321xyz',
    u 'StackResourceDriftStatus': 'MODIFIED',
    u 'LogicalResourceId': 'MySecGrp1'
  }, {
    u 'StackId': 'arn:aws:cloudformation:eu-west-1:12345678:stack/my_stack/12345,
    u 'ResourceType': 'AWS::ElasticLoadBalancingV2::TargetGroup',
    u 'PhysicalResourceId': 'arn:aws:elasticloadbalancing:eu-west-1:12345678:targetgroup/my_resource_id',
    u 'StackResourceDriftStatus': 'MODIFIED',
    u 'LogicalResourceId': 'NyTargerGroup1'
  }, {
    u 'StackId': 'arn:aws:cloudformation:eu-west-1:12345678:stack/my_stack/12345,
    u 'ResourceType': 'AWS::EC2::Instance',
    u 'PhysicalResourceId': 'i-123456789xyz',
    u 'StackResourceDriftStatus': 'MODIFIED',
    u 'LogicalResourceId': 'MyServer1'
  }, {
    u 'StackId': 'arn:aws:cloudformation:eu-west-1:12345678:stack/my_stack/12345,
    u 'ResourceType': 'AWS::EC2::SecurityGroup',
    u 'PhysicalResourceId': 'sg-123456789xyz',
    u 'StackResourceDriftStatus': 'MODIFIED',
    u 'LogicalResourceId': 'MySecGrp2'
  }]
}
  

Я пытаюсь распечатать PhysicalResourceId и LogicalResourceId где ResourceType == AWS::EC2::SecurityGroup . В одном ответе может быть несколько таких значений.

Я продвинулся лишь настолько, что смог увидеть, как возвращать определенное значение, но это далеко от того, что мне все еще нужно: print (drifts ['StackResourceDrifts'][0]['ResourceType'])

Я новичок в Python, поэтому был бы признателен за помощь в том, как этого добиться.

Ответ №1:

Попробуйте это. Конечным будет список словаря.

 final = []
for item in drifts['StackResourceDrifts']:
    if item['ResourceType'] == 'AWS::EC2::SecurityGroup':
        final.append({'PhysicalResourceId': item['PhysicalResourceId'],
              'LogicalResourceId': item['LogicalResourceId']
              })

print(final)