How to use Boto3 pagination

前端 未结 1 451
春和景丽
春和景丽 2020-12-06 06:06

BACKGROUND:

The AWS operation to list IAM users returns a max of 50 by default.

Reading the docs (links) below I ran following code and returned a complete

相关标签:
1条回答
  • 2020-12-06 06:42

    (Answer rewrite) **NOTE **, the paginator contains a bug that doesn't tally with the documentation (or vice versa). MaxItems doesn't return the Marker or NextToken when total items exceed MaxItems number. Indeed PageSize is the one that controlling return of Marker/NextToken indictator.

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

    It is not your mistake that your code doesn't works. MaxItems in the paginator seems become a "threshold" indicator. Ironically, the MaxItems inside original boto3.iam.list_users still works as mentioned.

    If you check boto3.iam.list_users, you will notice either you omit Marker, otherwise you must put a value. Apparently, paginator is NOT a wrapper for all boto3 class list_* method.

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

    You can follow up the issue I filed in boto3 github. According to the member, you can call build_full_result after paginate(), that will show the desire behavior.

    0 讨论(0)
提交回复
热议问题