如何使用Boto3分页

use*_*097 5 amazon-web-services python-3.x 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'])
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

谢谢.

moo*_*oot 10

(回答重写)**注意**,分页符包含一个与文档不符的错误(反之亦然).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()
Run Code Online (Sandbox Code Playgroud)

您的代码不起作用并不是您的错误.MaxItems在分页器中似乎成为一个"门槛"指标.具有讽刺意味的是,MaxItems内部原版boto3.iam.list_users仍然如上所述.

如果你检查boto3.iam.list_users,你会注意到你省略了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()
Run Code Online (Sandbox Code Playgroud)

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

  • 使用 build_full_result 的示例: `paginator = client.get_paginator('list_users'); 用户= paginator.paginate().build_full_result()` (3认同)

小智 5

这段代码对我不起作用。它总是丢弃最后一页上的其余项目,并且不将它们包含在结果中。当我知道我有 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
Run Code Online (Sandbox Code Playgroud)