Python(boto3)에서 DynamoDB의 모든 항목 가져오기

DynamoDB에는 "전체 선택"이 없습니다 — 테이블 전체를 읽는다는 것은 **끝까지 페이지네이션하는 scan**을 의미합니다. 각 응답은 최대 1 MB를 담습니다. boto3의 내장 scan 페이지네이터가 모든 페이지에 걸쳐 LastEvaluatedKey를 대신 따라갑니다.

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

Explanation

  • 페이지네이터가 핵심 — 단일 scan 호출은 테이블을 반환하지 않습니다. 최대 1 MB를 반환할 뿐입니다. client.get_paginator("scan")은 테이블이 소진될 때까지 후속 요청을 발행합니다(LastEvaluatedKeyExclusiveStartKey로 다시 전달) — 항목이 왜 "누락되는지" 의아해할 때 사람들이 잊는 그 루프입니다. (직접 처리하시나요? 응답에 LastEvaluatedKey가 있는 동안 계속 호출하세요.)
  • 메모리items는 테이블 전체를 담습니다. 큰 테이블의 경우 누적하지 말고 루프 안에서 각 page를 처리하세요(파일에 쓰기, 스트리밍, 집계).
  • 큰 테이블에서 더 빠르게: 병렬 스캔Segment=i, TotalSegments=N을 전달하고 N개의 워커(스레드/프로세스)를 실행하며, 각 워커가 자신의 세그먼트를 페이지네이션합니다. 총비용은 동일하지만 실제 소요 시간은 훨씬 낮습니다.
  • 비용 — 전체 스캔은 실행할 때마다 모든 항목의 모든 바이트를 읽고(청구합니다). ProjectionExpression은 응답을 줄일 뿐 청구액은 줄이지 않습니다. 핫 경로에 스캔을 두지 마세요 — 그것이 query와 접근 패턴 설계가 있는 이유입니다.
  • 항목은 DynamoDB JSON({"S": ...})으로 반환됩니다. 네이티브 Python 타입을 선호하시나요? 리소스 API(table.scan + 수동 LastEvaluatedKey 루프 — 리소스 API에는 페이지네이터가 없습니다)를 사용하세요.

Do it visually

테이블을 눈으로 훑어보는 데는 스크립트가 필요 없습니다: DynoTable을 다운로드해 어떤 테이블이든 페이지네이션된 그리드에서 탐색하세요 — 스캔을 대신 페이지네이션하므로 잘못 짤 루프가 없습니다. 그리고 스캔하고 비용을 치르기 전에, DynamoDB 요금 계산기가 테이블 전체 읽기의 실제 비용을 보여줍니다.

References

Last verified 2026-07-13 against the official AWS documentation linked above.

이 요청을 시각적으로 만들기

무료 DynamoDB 쿼리 빌더에서 이 작업을 구성하세요 — 키 조건, 필터, 인덱스, Limit, 정렬 순서, 페이지네이션 루프 — 그리고 실행 가능한 SDK v3, CLI, boto3 프로그램으로 다시 복사하세요.

DynamoDB 쿼리 빌더 열기

Console 없이 DynamoDB 작업하기

DynoTable은 DynamoDB를 위한 빠른 데스크톱 클라이언트입니다 — 테이블을 탐색하고, SQL 스타일 쿼리를 실행하고, 항목을 로컬에서 편집하세요.