背景:
列出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
感谢。
答案 0 :(得分:9)
(回答重写)
**注意**,分页符包含一个与文档不相符的错误(反之亦然)。当项目总数超过MaxItems数时,MaxItems
不会返回Marker或NextToken。确实PageSize
是控制Marker / NextToken指示符返回的那个。
import sys
import boto3
iam = boto3.client("iam")
marker = None
while True:
paginator = iam.get_paginator('list_users')
response_iterator = paginator.paginate(
PaginationConfig={
'PageSize': 10,
'StartingToken': marker})
for page in response_iterator:
print("Next Page : {} ".format(page['IsTruncated']))
u = page['Users']
for user in u:
print(user['UserName'])
try:
marker = page['Marker']
print(marker)
except KeyError:
sys.exit()
您的代码不起作用并不是您的错误。分页器中的MaxItems
似乎成了一个"阈值"指示符。具有讽刺意味的是,原始boto3.iam.list_users中的MaxItems
仍然如上所述。
如果您查看boto3.iam.list_users,您会注意到省略Marker
,否则您必须输入一个值。显然,对于所有boto3类list_ *方法, paginator不是包装器。
import sys
import boto3
iam = boto3.client("iam")
marker = None
while True:
if marker:
response_iterator = iam.list_users(
MaxItems=10,
Marker=marker
)
else:
response_iterator = iam.list_users(
MaxItems=10
)
print("Next Page : {} ".format(response_iterator['IsTruncated']))
for user in response_iterator['Users']:
print(user['UserName'])
try:
marker = response_iterator['Marker']
print(marker)
except KeyError:
sys.exit()
您可以跟进the issue I filed in boto3 github。根据该成员,您可以在paginate()之后调用build_full_result
,这将显示所需的行为。