如何使用Boto3分页

新手上路,请多包涵

背景:

默认情况下,列出 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 许可协议

阅读 1.3k
2 个回答

(答案重写)**注意 **,分页器包含一个与文档不符的错误(反之亦然)。 MaxItems 当项目总数超过 MaxItems 数量时不返回标记或 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 = response_iterator['Marker']
        print(marker)
    except KeyError:
        sys.exit()

您的代码不起作用不是您的错误。 MaxItems 在分页器中似乎成为一个“阈值”指标。具有讽刺意味的是,原始 boto3.iam.list_users 中的 MaxItems 仍然如前所述工作。

如果您检查 boto3.iam.listusers,您会注意到您省略了 Marker ,否则您必须输入一个值。显然, **paginator 不是所有 boto3 类 list* 方法的包装器**。

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

你可以跟进 我在 boto3 github 中提交的问题。根据该成员的说法,您可以在 paginate() 之后调用 build_full_result ,这将显示期望行为。

原文由 mootmoot 发布,翻译遵循 CC BY-SA 4.0 许可协议

这段代码对我不起作用。它总是丢弃最后一页上的剩余项目,并且不将它们包含在结果中。当我知道我有 68 个帐户时,却给我 60 个帐户的结果。最后一个结果页面没有附加到我的帐户用户名列表中。我担心上面的这些例子在做同样的事情,而人们没有在结果中注意到这一点。

那而且出于什么目的以任意大小分页似乎过于复杂?

这应该很简单,并为您提供完整的清单。

 import boto3
iam = boto3.client("iam")
paginator = iam.get_paginator('list_users')
response_iterator = paginator.paginate()
accounts=[]
for page in response_iterator:
    for user in page['Users']:
        accounts.append(user['UserName'])
len(accounts)
68

原文由 Jeff S 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进