🦅

AWS Step Functionsで実装されたサーガパターンをデプロイしてみた

2025/03/07に公開

概要

タイトルの通りです。
マイクロサービスを勉強する中で、トランザクションの一貫性を保つ際にサーガパターンというものが存在するとのことだったのですが、実際どうやって実装されるのか分からなかったのでやってみました。

AWS Step Functionsでの実装内容

今回は以下のページで紹介されている実装をデプロイします。

https://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/implement-the-serverless-saga-pattern-by-using-aws-step-functions.html

Step Functionsで全体の処理フローを定義して、各処理はLambdaで行うように実装されています。実行時はワークフローがAPI GatewayとLambda経由で呼び出されます。

この実装では旅行予約システムを想定しており、処理フローは

  1. 航空券の予約 (ReserveFlight)
  2. レンタカーの予約 (ReserveCarrental)
  3. 支払いの処理 (ProcessPayment)
  4. 航空券の予約の確認 (Confirm Flight)
  5. レンタカー予約の確認 (Confirm Carrental)

の順番で構成されています。一連の処理に成功するとされると通知がSNS経由で送られる仕組みになっています。ただし、トランザクション中にいずれかの処理にエラーが発生すると、ロールバックが行われます。ロールバック時は

  1. 返金処理(RefundPayment)
  2. レンタカーの予約のキャンセル (CancelRentalReservation)
  3. 航空券の予約のキャンセル(CancelFlightReservation)

の順番で処理が行われます。なお、それぞれの処理に応じてFlightsテーブル、Paymentsテーブル、Rentalsテーブルのレコードが更新されます。

デプロイ

Lambda関数がTypeScriptで実装されているので、まずは以下のコマンドでnpmのパッケージのインストールとTypeScriptのコードのビルドを行います。

npm install
npm run build

このパターンは複数のIaCツールで実装されていいますが、今回はTerraformでデプロイしてみます。CDKやSAMでも実装されているみたいなので、自分のお好みのツールを選んでください。
以下のコマンドでTerraform環境の初期化とapplyを行います。

terraform init
terraform apply

applyが完了したら、実際にトランザクションを実行してみます。以下のコマンドでAPI Gatewayにリクエストを送ってみます。

curl https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/test

上手くいくと、以下のようなメッセージが返ってきます。

{"message":"Your reservation is being processed"}

マネコンでStep Functionsのページを見ても、ちゃんと処理が成功していますね。

DynamoDBのテーブルを見てみます。



Flightsテーブル、Paymentsテーブル、Rentalsテーブルそれぞれにレコードが追加されていることがわかります。

ロールバックの挙動の確認

サーガパターンはDBを跨ぐトランザクション処理を保証するものなので、途中で処理が失敗してもちゃんとロールバックされるか確認してみます。

API Gatewayのエンドポイントを呼び出す際にクエリパラメータで失敗の処理を指定できるみたいなので、以下のコマンドでトランザクションの一番最後の5. レンタカーの確認 (Confirm Carrental)で処理を失敗させてみます。

https://https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/test?runType=failCarRentalConfirmation

マネコン上で見ると、正しくロールバックできてそうです。

最後に

DynamoDBの項目単位でのログも見てみたかったですが、少し手間がかかりそうなので割愛しました。DynamoDB Streamsに保存されたデータをLambda関数でフェッチするようなのですが、CloudWatch Logsに直に出力したいところです。

Discussion