Обычно я пишу свою собственную логику разбиения на страницы, что-то вроде следующего:
while True:
responseListPolicies = iam_client.list_policies(Marker=marker) if marker else iam_client.list_policies()
truncatedListPolicies = responseListPolicies.get('IsTruncated')
allPolicies = responseListPolicies.get('Policies')
allPolicyArns += [policy.get('Arn') for policy in allPolicies]
allPolicyNames += [policy.get('PolicyName') for policy in allPolicies]
if not truncatedListPolicies:
break
marker = responseListPolicies.get('Marker')
print("Found truncated at marker " + marker)
Однако недавно я наткнулся на pagination
, доступный через boto3, и решил поиграть с ним.Вот где я наткнулся на похожую проблему, пытаясь получить групповые политики.
Вот фрагмент того, что я пробовал:
paginator = iam_client.get_paginator('list_group_policies')
res = paginator.paginate(GroupName=name, PaginationConfig={'MaxItems': 100000})
listOfAllPolicyNames += res.build_full_result().get('PolicyNames')
И это выдало ошибку вроде:
Произошла ошибка (NoSuchEntity) при вызове операции ListGroupPolicies: Группа с именем groupName не найдена.
Я начал ее изучать.Я попытался понять, какие методы доступны для объекта res .Так что dir (res) дал что-то вроде этого (частичные результаты показаны ниже):
...
'build_full_result',
'non_aggregate_part',
'result_key_iters',
'result_keys',
'resume_token',
'search']
В итоге я посмотрел на result_keys , и это было что-то вроде этого:
[{'type': 'field', 'children': [], 'value': 'PolicyNames'}]
Я заметил, что элемент children
был пустым списком.Поэтому я попробовал описанную выше нумерацию страниц с другим именем группы, которое, как я знал, наверняка будет иметь некоторые встроенные политики.И на этот раз также результаты были одинаковыми.В конце концов, я понял, что, возможно, не существует ключа, доступного напрямую, на который можно было бы обратить внимание.
Итак, наконец, пришлось прибегнуть к способу обработки исключений, как показано ниже:
try:
paginator = iam_client.get_paginator('list_group_policies')
res = paginator.paginate(GroupName=name, PaginationConfig={'MaxItems': 100000})
res.build_full_result()
except Exception as e:
if e.response['Error']['Code'] == 'NoSuchEntity':
print("Entity does not exist")
Не знаю, насколько это поможет.Но это подход, который я выбрал.Ура!