#python #list #loops #dictionary #collections
Вопрос:
Я пытаюсь перебрать ключ «Ресурс», чтобы определить, удовлетворяет ли он какому-либо условию.
У меня есть пример использования, в котором мне нужно повторить каждый из ключей ресурсов, чтобы определить, равен ли он определенному значению. По сути, я просто проверяю, что политика имеет правильные разрешения.
{'Action': ['s3:PutObject', 'kms:GenerateKey'],
'Effect': 'Allow'
'Resource': ['arn:aws:kms:us-west-2:<account_id>:key/*',
'arn:aws:s3:::bucket]}
Есть ли способ повторить каждое значение в списке ресурсов?
До сих пор у меня есть это
for value in policy:
Resource = value['Resource']
for resource in Resources:
if resource == 'arn:aws:s3:::bucket'
return True
Однако я только что понял, что это работает не так, как ожидалось.
Комментарии:
1. что не работает? вы должны предоставить сведения об отладке. В вашем случае есть опечатка: вы назначаете
Resource
, но проходитеResources
2. Я думаю, что вам не хватает «в конце этой строки «Ресурс»: [«arn:aws:kms:us-west-2:<идентификатор учетной записи>:ключ/*», «arn:aws:s3:::ведро]
3. там также отсутствует запятая после
'Allow'
и отступ под вашим «если»… Вы также должны удалить свой первый цикл и назначитьResources = policy['Resource']
Ответ №1:
Это то, что тебе нужно:
for value in policy:
Resource = value['Resource']
if 'arn:aws:s3:::bucket' in Resource:
return True
Если вы все еще хотите просмотреть список:
for value in policy:
Resource = value['Resource']
for resource in Resource:
if resource == 'arn:aws:s3:::bucket':
return True
Пожалуйста, обратите внимание на опечатку в вашем коде: for resource in Resources:
должно быть for resource in Resource:
Вы добавили дополнительные буквы s в имя переменной Resource
Комментарии:
1. Существует ли также способ управления несколькими различными ресурсами в этой политике, которые являются отдельными действиями?
2. Вы имеете в виду получить ресурс и связанное с ним действие?
3. Первая коробка, кажется, сработала, спасибо.
Ответ №2:
Вы можете просто получить массив, соответствующий ключу «Ответ» в словаре, и выполнить итерацию по нему.
dct = {'Action': ['s3:PutObject', 'kms:GenerateKey'],
'Effect': 'Allow'
'Resource': ['arn:aws:kms:us-west-2:<account_id>:key/*',
'arn:aws:s3:::bucket']}
resource = dct.get('Resource')
for array_element in resource:
# do stuff as you wish with each array_element
Ответ №3:
У меня такое чувство, что ты действительно хочешь это сделать:
bucket_policies = [
each for each in policy
if 'arn:aws:s3:::bucket' in each['Resource']
]
Это позволит вам получить список политик в разделе политика, в котором есть этот ключ в ресурсе.
Ответ №4:
Ты хочешь этого:
dct ={'Action': ['s3:PutObject', 'kms:GenerateKey'],'Effect':'Allow',
'Resource': ['arn:aws:kms:us-west-2:<account_id>:key/*','arn:aws:s3:::bucket']}
for r in dct.get('Resource'):
print(r)
Выход:
arn:aws:kms:us-west-2:<account_id>:key/*
arn:aws:s3:::bucket
Вы можете использовать in
и dct.get('Resource')
как показано ниже:
>>> print('arn:aws:s3:::bucket' in dct.get('Resource'))
True
>>> print('arn:aws:kms:us-west-2:<account_id>:key/*' in dct.get('Resource'))
True
>>> print('lara lara ' in dct.get('Resource'))
False