Step Functions と Lambda を使って DynamoDB Scan をページ分割して実行する

SFn-LambdaでDynamoDBを繰り返しScanする
2023.02.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

おはようございます、もきゅりんです。

Shall we sfn ?

タイトルのような検証があったため、簡易なコードですが、ブログにしておきます。

背景

DynamoDB (以下DDB) テーブルは、1回の Scan オペレーションの取得制限が最大1MB です。

そのため、テーブルに大量のデータが存在するような場合に、全件取得を図る Scan オペレーションの結果、データの続きがあるかどうかを確認した上で、再び Scan を実行するかどうかを考慮する処理にしないといけません。

詳細は公式ドキュメントの 結果のページ分割 を参照下さい。

本稿では、このような継続的な Scan を想定した実行を Step Functions と Lambda を使って行います。

やること

Step Functions はワークフロー自体を参考図にできるため、そのまま利用します。

sfn-workflow

ワークフローを実行する際に、 DDB の Scan Limit のパラメータ値を入力します。

図で描写されているように、 Lambda が DDB Scan タスクをし、データ結果に続きがある場合は、 LastEvaluatedKey と初期入力の Limit 値を返しています。

それを受けてワークフローは Lambda の DDB Scan タスク に戻ります。

LastEvaluatedKeynull になるまでワークフローは繰り返されます。

それ以外の状態はエラーになります。

環境

  • 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件で取得して完了となっています。

sfn_logs

さいごに

久しぶりに Step Functions に触れてみると、ステート間のパラメータ受け渡しについてはどのようにすれば良いのか、なかなか悩むものがありました。

本稿のやり方がベストかどうかなのかはもう少し SFn の勉強が必要なのですが、できるだけシンプルなやり方でまとめてみました。

以上です。

どなたかの参考になれば幸いです。

参考