背景:
默认情况下,列出 IAM 用户的 AWS 操作最多返回 50 个。
阅读下面的文档(链接),我运行了以下代码并通过将“MaxItems”设置为 1000 返回了完整的数据集。
paginator = client.get_paginator('list_users')
response_iterator = paginator.paginate(
PaginationConfig={
'MaxItems': 1000,
'PageSize': 123})
for page in response_iterator:
u = page['Users']
for user in u:
print(user['UserName'])
http://boto3.readthedocs.io/en/latest/guide/paginators.html https://boto3.readthedocs.io/en/latest/reference/services/iam.html#IAM.Paginator.ListUsers
问题:
例如,如果“ MaxItems ”设置为 10,循环结果的最佳方法是什么?
我测试了以下但它只在’IsTruncated’ == False 之前循环 2 次迭代并导致“KeyError:’Marker’”。不确定为什么会这样,因为我知道有 200 多个结果。
marker = None
while True:
paginator = client.get_paginator('list_users')
response_iterator = paginator.paginate(
PaginationConfig={
'MaxItems': 10,
'StartingToken': marker})
#print(response_iterator)
for page in response_iterator:
u = page['Users']
for user in u:
print(user['UserName'])
print(page['IsTruncated'])
marker = page['Marker']
print(marker)
else:
break
原文由 user45097 发布,翻译遵循 CC BY-SA 4.0 许可协议
(答案重写)**注意 **,分页器包含一个与文档不符的错误(反之亦然)。
MaxItems
当项目总数超过 MaxItems 数量时不返回标记或 NextToken。事实上PageSize
是控制 Marker/NextToken 指示器返回的那个。您的代码不起作用不是您的错误。
MaxItems
在分页器中似乎成为一个“阈值”指标。具有讽刺意味的是,原始 boto3.iam.list_users 中的MaxItems
仍然如前所述工作。如果您检查 boto3.iam.listusers,您会注意到您省略了
Marker
,否则您必须输入一个值。显然, **paginator 不是所有 boto3 类 list* 方法的包装器**。你可以跟进 我在 boto3 github 中提交的问题。根据该成员的说法,您可以在 paginate() 之后调用
build_full_result
,这将显示期望行为。