본문 바로가기

boto3에서 list 결과가 잘릴 때 paginator로 전체 받기

조회 1 · 댓글 0
동교동삼거리동교동삼거리작성자2026년 9월 7일

boto3로 list_objects_v2describe_instances 같은 조회 API를 부르면 한 번에 일부만 돌아오고 NextToken(또는 Marker)을 다음 호출에 다시 넣어야 나머지가 나옵니다. 이 while 루프를 직접 짜다 보면 토큰 키 이름이 API마다 달라 실수하기 쉽습니다. 이럴 때 paginator를 쓰면 토큰 처리를 boto3가 대신 해줍니다.

client.get_paginator('오퍼레이션명')으로 paginator를 만들고 paginate()를 돌리면 페이지 단위로 순회됩니다. 오퍼레이션명은 list_objects_v2처럼 클라이언트 메서드 이름 그대로 넣습니다.

import boto3

client = boto3.client('s3', region_name='ap-northeast-2')
paginator = client.get_paginator('list_objects_v2')

for page in paginator.paginate(Bucket='my-bucket', Prefix='logs/'):
    for obj in page.get('Contents', []):
        print(obj['Key'])

총 개수나 페이지 크기를 조절하려면 PaginationConfig를 넘깁니다. MaxItems는 전체 반환 항목 상한, PageSize는 API 호출당 요청 개수(서비스가 더/덜 줄 수 있음), StartingToken은 이전 토큰에서 이어받기입니다. 결과를 클라이언트에서 걸러내려면 PageIterator.search()에 JMESPath 식을 줄 수 있습니다.

pages = paginator.paginate(
    Bucket='my-bucket',
    PaginationConfig={'MaxItems': 100, 'PageSize': 50},
)
for key in pages.search("Contents[?Size > `100`][].Key"):
    print(key)

주의할 점 하나. PageSize로 호출당 개수를 줄여도 MaxItems까지 채우려면 여러 번 호출하므로 총 API 콜 수는 오히려 늘 수 있습니다. 페이지네이션 지원 여부와 오퍼레이션명은 각 서비스 문서에서 확인하면 됩니다.

🔗 https://docs.aws.amazon.com/boto3/latest/guide/paginators.html

로그인 후 답글을 남길 수 있습니다.