如何使用Boto3分页

2024-03-24

背景:

默认情况下,列出 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 http://boto3.readthedocs.io/en/latest/guide/paginators.html https://boto3.readthedocs.io/en/latest/reference/services/iam.html#IAM.Paginator.ListUsers https://boto3.readthedocs.io/en/latest/reference/services/iam.html#IAM.Paginator.ListUsers

问题:

If the "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

(答案重写) **注意**,分页器包含一个与文档不符的错误(反之亦然)。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 = response_iterator['Marker']
        print(marker)
    except KeyError:
        sys.exit()

您的代码不起作用并不是您的错误。MaxItems在分页器中似乎成为一个“阈值”指标。讽刺的是,MaxItems原来的 boto3.iam.list_users 内部仍然按上述方式工作。

如果您检查 boto3.iam.list_users,您会注意到您省略了Marker,否则您必须输入一个值。显然,分页器不是包装器对于所有 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 中提交的问题 https://github.com/boto/boto3/issues/788#issuecomment-243579503。据该会员介绍,您可以拨打build_full_result在 paginate() 之后,这将显示所需的行为。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用Boto3分页 的相关文章

随机推荐