#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)