boto3에서 list 결과가 잘릴 때 paginator로 전체 받기
boto3로 list_objects_v2나 describe_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
로그인 후 답글을 남길 수 있습니다.