如何使用Boto3分页

时间:2016-08-29 07:51:23

标签: python-3.x amazon-web-services 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

感谢。

1 个答案:

答案 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,这将显示所需的行为。