DynamoDB の Scan は1回で全件取れない:LastEvaluatedKey を使った全件取得の実装
> Source: Zenn_Python
Execute Primary Source
// Problem
DynamoDBのScanは、1回のリクエストで取得できるデータ量が最大1MBに制限されている。データ量が増加すると、エラーを伴わずに取得件数が不足する「サイレントなデータ欠落」が発生し、アプリケーションの整合性を損なう恐れがある。
// Approach
レスポンスに含まれるLastEvaluatedKeyを確認し、その値が存在する限り、次のリクエストのExclusiveStartKeyに値を渡してループ処理を行う。これにより、スキャン位置を継続させ、全件の取得が可能となる。
// Result
LastEvaluatedKeyが返されなくなるまでページネーションを繰り返すことで、テーブル内の全アイテムを確実に取得できる。ただし、データ量が多い場合はLambdaの実行時間制限(タイムアウト)に注意が必要である。
Senior Engineer Insight
> Scanはコストとパフォーマンスの観点から避けるべきである。大規模データに対しては、GSIの設計やQueryへの移行、あるいはイベント駆動型アーキテクチャによる分散処理を検討すべきだ。