web-dev-qa-db-ja.com

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.htmlhttps://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

ありがとう。

9
user45097

(回答の書き直し)**注**、ページ編集者には、ドキュメントと一致しない(またはその逆)バグが含まれています。 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 = page['Marker']
        print(marker)
    except KeyError:
        sys.exit()

コードが機能しないのは間違いではありません。ページネーターのMaxItemsは、「しきい値」インジケーターになるようです。皮肉なことに、元のboto3.iam.list_users内のMaxItemsは、前述のように引き続き機能します。

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

フォローアップできます 私がboto3 githubに提出した問題 。メンバーによると、build_full_result paginate()の後、欲求の振る舞いを示します。

10
mootmoot