Python(boto3)에서 DynamoDB의 모든 항목 가져오기
boto3에서 테이블 전체를 읽는다는 것은 scan을 끝까지 페이지네이션한다는 뜻입니다. 각 응답은 1 MB에서 잘리며, 저수준 클라이언트의 내장 페이지네이터가 모든 페이지에 걸쳐 LastEvaluatedKey를 따라가 줍니다(DynamoDB 커서의 동작 방식).
여기서는 페이지네이션보다 어떤 boto3 API를 고르느냐가 더 중요하고, 페이지네이터는 그 이유의 절반일 뿐입니다.
Code
import boto3
client = boto3.client("dynamodb")
paginator = client.get_paginator("scan")
items = []
for page in paginator.paginate(TableName="Music"):
items.extend(page["Items"])
print(f"Table holds {len(items)} items")설명
- 페이지네이터는 리소스가 아니라 클라이언트에 있습니다 —
boto3.resource("dynamodb").Table(…).scan에는 페이지네이터가 아예 없으므로, 그쪽에서는LastEvaluatedKey루프를 직접 작성해야 합니다. 그것만으로도 전체 읽기에 저수준 클라이언트를 쓸 이유가 됩니다. - 리소스 API는 숫자를
Decimal로 변환합니다 — 저장된{"N": "1994"}가Decimal('1994')로 돌아오는데,json.dumps는 커스텀 인코더 없이는 이를 직렬화하지 않습니다. 위의 클라이언트는 원시{"N": "1994"}를 그대로 넘겨주고 변환은 여러분에게 맡깁니다(인코딩 방식). - 페이지네이터를 갈아 치우지 말고 조정하세요 —
paginator.paginate(TableName="Music", PaginationConfig={"PageSize": 500, "MaxItems": 10000}). Boto3는PageSize를 "각 결과의 페이지당 반환되는 항목 수"로,MaxItems를 전체에 대한 상한으로 정의하며, 후자는StartingToken으로 이어받을 수 있는NextToken을 내놓습니다. - 병렬 스캔에는 스레드당 클라이언트 하나가 필요하고, 조심스럽게 만들어야 합니다 —
Segment와TotalSegments가 작업을 나누며, boto3 자체의 안내는 클라이언트는 스레드 안전하지만 세션과 리소스는 그렇지 않다는 것입니다. 또한 "동시성 컨텍스트 안에서boto3.client()를 호출하면 응답 순서 문제가 생길 수 있다"고 경고합니다. 팬아웃하기 전에 클라이언트를 만들거나, 각 워커에 자체boto3.session.Session()을 주세요(병렬이 값어치를 하는 때). items는 테이블 크기만큼 커집니다 — 테이블이 작다는 것을 이미 알고 있는 게 아니라면, 계속 들고 있는 리스트를 늘리지 말고 루프 안에서 각page를 처리하세요.- 스캔은 실행할 때마다 읽은 모든 바이트를 청구합니다 —
ProjectionExpression은 응답을 줄일 뿐 청구액을 줄이지 않고(이유),FilterExpression은 항목을 읽고 과금한 뒤에 걸러냅니다(필터가 있는 Scan). 자주 호출되는 경로라면 query가 필요합니다.
시각적으로 해 보기
전체 스캔의 청구액은 항목 크기 × 항목 수를 4 KB 단위로 올림한 값입니다. 항목 크기 계산기는 붙여 넣은 항목으로 그중 항목당 절반을 알려 줍니다.
DynoTable은 대신 무한 스크롤 그리드에서 라이브 테이블을 페이지네이션하고, SQL 편집기는 실행 전에 쿼리가 어떤 작업으로 컴파일되는지 알려 줍니다. RCU 추정치는 테이블 메타데이터가 뒷받침할 때만 표시됩니다. DynoTable 내려받기.
관련 예제
- Node.js에서 모든 항목 가져오기 — 같은 전체 읽기를 명시적 루프로.
- AWS CLI로 모든 항목 가져오기 — CLI가 대신 페이지네이션해 줍니다.
- Python에서 DynamoDB Scan —
FilterExpression을 사용한 스캔. - 병렬 스캔 — Segment/TotalSegments, 워커 수, 그리고 언제 신경 쓸 가치가 있는지.
- DynamoDB Scan은 왜 느리고 비쌀까? — 비용 모델과 이를 피하는 방법.
- DynamoDB ProvisionedThroughputExceededException — 테이블 전체를 읽는 것은 이 오류를 만나는 전형적인 방법입니다.
- "The provided starting key is invalid" — 페이지네이션 루프에서 망가진 재개 키.
참고 자료
- Scan — Amazon DynamoDB API Reference
- DynamoDB.Paginator.Scan — Boto3 documentation
- Scanning tables in DynamoDB — Amazon DynamoDB Developer Guide
- DynamoDB read and write operations (capacity unit consumption) — Amazon DynamoDB Developer Guide
- Paginators — Boto3 documentation
- Clients (thread safety) — Boto3 documentation
위에 링크된 공식 AWS 문서를 기준으로 2026-07-28에 마지막으로 확인했습니다.