Step Functions と Lambda を使って DynamoDB Scan をページ分割して実行する
はじめに
おはようございます、もきゅりんです。
Shall we sfn ?
タイトルのような検証があったため、簡易なコードですが、ブログにしておきます。
背景
DynamoDB (以下DDB) テーブルは、1回の Scan オペレーションの取得制限が最大1MB です。
そのため、テーブルに大量のデータが存在するような場合に、全件取得を図る Scan オペレーションの結果、データの続きがあるかどうかを確認した上で、再び Scan を実行するかどうかを考慮する処理にしないといけません。
詳細は公式ドキュメントの 結果のページ分割 を参照下さい。
本稿では、このような継続的な Scan を想定した実行を Step Functions と Lambda を使って行います。
やること
Step Functions はワークフロー自体を参考図にできるため、そのまま利用します。
ワークフローを実行する際に、 DDB の Scan Limit のパラメータ値を入力します。
図で描写されているように、 Lambda が DDB Scan タスクをし、データ結果に続きがある場合は、 LastEvaluatedKey
と初期入力の Limit 値を返しています。
それを受けてワークフローは Lambda の DDB Scan タスク に戻ります。
LastEvaluatedKey
が null
になるまでワークフローは繰り返されます。
それ以外の状態はエラーになります。
環境
- node 18.13.0
- npm 8.19.3
- typescript 4.9.5
- cdk 2.62.0
前提
DDBテーブルが既に存在し、何らかのデータを投入しているとします。
本稿でのデータの準備としては DynamoDB に大量データを Promise.all で書き込み、読込みしてみる | DevelopersIO も利用します。
こちらのデータでは348レコードが投入されます。
実行する
GitHubリポジトリから clone して、各ディレクトリで npm install
の上、cdk deploy
コマンドでデプロイします。
Step Functions のコンソール画面 > 実行の開始から以下の入力を設定して実行します。
{ "limit": 100 }
実行して成功後のログを見ると、Lambad が3周して最後に48件で取得して完了となっています。
さいごに
久しぶりに Step Functions に触れてみると、ステート間のパラメータ受け渡しについてはどのようにすれば良いのか、なかなか悩むものがありました。
本稿のやり方がベストかどうかなのかはもう少し SFn の勉強が必要なのですが、できるだけシンプルなやり方でまとめてみました。
以上です。
どなたかの参考になれば幸いです。