あるEコマース企業が、商品データの更新があるたびにDynamoDBテーブルへの書き込みが発生する。このデータ変更を複数の下流サービス(検索インデックス更新・レコメンデーションエンジン・監査ログ)にリアルタイムに伝播させたい。DynamoDB Streamsを使ったLambdaトリガーで各サービスに通知しているが、Lambda関数が肥大化して単一責任の原則を破っている。コードの変更を最小限に抑えつつ、各処理を独立したサービスに分離しながらDynamoDBの変更を確実に全下流サービスに伝播する構成として最も適切なものはどれか。
- A. DynamoDB StreamsのLambdaトリガーを3つに分け、それぞれが検索・レコメンド・監査に特化したLambdaを直接呼び出す
- B. DynamoDB StreamsをEventBridge Pipesのソースに設定し、ターゲットにSNSトピックを指定する。SNSトピックに各サービスのSQSキューをサブスクライブして下流処理を独立したLambdaに分担させる
- C. DynamoDB StreamsのLambdaから直接3つの下流LambdaをInvoke APIで並列非同期呼び出しする
- D. DynamoDB Streamsを無効にし、アプリケーション側の書き込みコードでDynamoDB更新後に各サービスのAPIを直接呼び出す
解答と解説を見る
正解: B
EventBridge Pipesは「ソース(DynamoDB Streamsなど)→フィルタリング→変換→ターゲット」というパイプライン構造を宣言的に構成できるサービスである。DynamoDB Streamsをソースに設定してSNSトピックをターゲットにすることで、DynamoDB変更イベントをフィルタリング・エンリッチメントした上でSNSに転送できる。SNSからSQSファンアウトパターンで各下流サービスの処理キューに独立して配信されるため、1つのサービスが失敗しても他には影響せず、各サービスのLambdaは独立してスケール・デプロイできる。コード実装は最小限で済み、単一責任の原則も保てる。選択肢AのLambdaトリガー3分割は、それぞれが同じDynamoDB Streamに接続することになるが、DynamoDB Streamsの1テーブルに対してLambdaトリガーは1つしか設定できないため、3つの直接トリガーは設定できない。選択肢CのLambdaからの直接並列呼び出しは単一責任問題を解消するが、呼び出し元Lambdaが3つのサービス呼び出しを管理する責務を持ち続けるため、根本的な分離にはならない。また、下流サービスの追加・削除のたびに呼び出し元コードの変更が必要になる。選択肢Dはアプリケーション側に通知責務を持ち込むアンチパターンであり、書き込みに失敗した場合は通知も失われ、サービス間結合度が高くなる。
📚 関連サービスの解説: Amazon DynamoDB ・ Amazon EventBridge