SAA SQS/SNS/EventBridge 設計パターン4選|キュー・ファンアウト・イベント駆動の要件別選択基準

AWS SAA-C03 でのメッセージングサービスを攻略する設計パターン4選。SQS Standard vs FIFO の使い分け、SNS ファンアウトパターン、EventBridge イベント駆動アーキテクチャ、デッドレターキュー(DLQ)活用まで、要件キーワードから即断できる粒度で解説。「疎結合・非同期処理」問題はこの4パターンで完全網羅できる。

「非同期処理・疎結合・イベント駆動」の問いに、SAA-C03 は4パターンしか答えを持っていない。 SQS・SNS・EventBridge は全て「コンポーネントを切り離す」サービスだが、「1対1でキューに溜める」「1対多でプッシュ通知する」「イベントパターンでルーティングする」の3軸で役割が明確に異なる。攻略の核心は**「誰が誰にどう届けるか(プル vs プッシュ)」「順序・重複の保証が必要か(Standard vs FIFO)」「複数の宛先に届けるか(ファンアウト)」「イベント内容で振り分けるか(EventBridge)」の4軸**で要件を振り分けることだ。本記事では、SAA-C03 の「疎結合・非同期処理」問題を即断できる4設計パターンを、要件キーワードから逆引きできる粒度で解説する。

※ 本記事はアフィリエイト広告(Amazon アソシエイト等)を含みます


📑 目次

  1. 結論:SQS/SNS/EventBridge は「キュー・ファンアウト・イベントルーティング」で分類できる
  2. SQS の基本構造(Standard vs FIFO)
  3. SNS の基本構造(ファンアウト・メッセージフィルタリング)
  4. EventBridge の基本構造(イベントバス・ルール・スケジュール)
  5. パターン1:SQS デカップリング(プロデューサー × コンシューマー 疎結合)
  6. パターン2:SQS FIFO で順序保証・重複排除
  7. パターン3:SNS ファンアウト(1対多プッシュ)
  8. パターン4:EventBridge イベント駆動アーキテクチャ
  9. 要件キーワード早見表
  10. 頻出ひっかけパターンと正しい打ち手
  11. 次のアクション チェックリスト
  12. 関連記事
  13. 関連サイト

1. 結論:3サービスの役割分担

SAA-C03 のメッセージング問題を最短で解く骨格は、「誰が、いつ、どこへ、どのように届けるか」を3つの軸で独立して判断することだ。

サービス配信モデルメッセージ保持主なユースケース
SQSプル型(コンシューマーが取りに行く)最大14日間コンポーネント間の疎結合・バッファ
SNSプッシュ型(トピックが全員に送る)保持なし1対多の通知・ファンアウト
EventBridgeイベントバス型(ルールで振り分け)保持なし(24時間リプレイ可)イベント駆動・SaaS連携・スケジュール

3サービスの違いを整理するだけで、SAA のメッセージング問題は4パターンに絞れる。「非同期にしたい」だけで SQS を選ばず、「1対多か」「順序が必要か」「イベント内容で振り分けるか」を先に判断することが正解への近道だ。


2. SQS の基本構造(Standard vs FIFO)

SQS Standard キュー

SQS Standard キューはほぼ無制限のスループットを持つ高速キューだ。

  • 配信保証: At-Least-Once(少なくとも1回配信。重複あり)
  • 順序: ベストエフォート(順序は保証されない)
  • スループット: ほぼ無制限 TPS
  • Visibility Timeout: メッセージを受け取ったコンシューマーが処理中の間、他のコンシューマーに見えなくなる(デフォルト30秒)
  • Dead Letter Queue(DLQ): 処理に繰り返し失敗したメッセージを別キューに隔離

SQS FIFO キュー

SQS FIFO キューは厳密な順序保証と重複排除を持つキューだ。

  • 配信保証: Exactly-Once(重複なし)
  • 順序: FIFO(First-In-First-Out)。MessageGroupId ごとに順序が保たれる
  • スループット: 300 TPS(バッチ処理で最大3,000 TPS)
  • 制約: Standard キューより低スループット。キュー名は .fifo サフィックス必須
SQS Standard vs FIFO
評価項目
Standard
FIFO
配信保証 At-Least-Once(重複あり) Exactly-Once(重複なし)
順序 ベストエフォート(保証なし) 厳密な FIFO 順序(MessageGroupId 単位)
スループット ほぼ無制限 TPS 300 TPS(バッチで最大3,000 TPS)
主なユースケース メール送信・ログ収集・バッファリング 金融取引・在庫更新・コマンド処理
SNS との連携 ○ SNS → SQS Standard ○ SNS FIFO → SQS FIFO のみ

Dead Letter Queue(DLQ)の役割

DLQ は処理失敗メッセージの隔離先だ。

通常フロー:
  プロデューサー → SQS キュー → コンシューマー(処理成功)→ メッセージ削除

失敗フロー:
  コンシューマーが処理失敗 → Visibility Timeout 経過後にキューに戻る
  → maxReceiveCount 回失敗 → DLQ(別キュー)に移動
  → DLQ のメッセージを調査・デバッグ

3. SNS の基本構造

SNS(Simple Notification Service)の仕組み

SNS はトピックにメッセージをパブリッシュすると、全サブスクライバーに同時プッシュ配信するサービスだ。

  • サブスクライバー: SQS・Lambda・HTTP/HTTPS・Email・SMS・Kinesis Data Firehose
  • メッセージ保持: なし(配信失敗時のリトライは行うが、恒久的な保存はしない)
  • ファンアウト: 1つのトピックに複数のサブスクライバーを登録することで、1発行で全員に届く

SNS メッセージフィルタリング

サブスクライバーごとにフィルターポリシーを設定することで、全メッセージではなく条件に一致するメッセージのみを受け取れる。

例:注文処理システムのフィルタリング
  SNS トピック「orders」

    ├── SQS キュー「pay-queue」  ← フィルター: {type: "payment"}
    ├── SQS キュー「ship-queue」 ← フィルター: {type: "shipment"}
    └── SQS キュー「notify-queue」← フィルター: {type: "notification"}

4. EventBridge の基本構造

EventBridge(旧 CloudWatch Events)の仕組み

EventBridge はイベントバスを通じて、ソースから発生したイベントをルールに基づいてターゲットに振り分けるサービスだ。

  • イベントバスの種類:

    • デフォルトバス: AWS サービスのイベント(EC2 起動・S3 オブジェクト作成等)が自動的に流れる
    • カスタムバス: アプリケーションの独自イベントを流す
    • パートナーバス: SaaS(Datadog・Zendesk 等)のイベントを直接受け取る
  • ルールの種類:

    • イベントパターンルール: イベントの内容(source・detail-type・detail フィールド)に一致したときに発火
    • スケジュールルール: cron/rate 式で定期実行(CloudWatch Events のスケジューラ機能の後継)
  • ターゲット: Lambda・SQS・SNS・Step Functions・API Gateway・Kinesis 等250種以上


5. パターン1:SQS デカップリング(プロデューサー × コンシューマー 疎結合)

要件のキーワード

  • 「Web アプリが注文を受け付けるが、バックエンド処理が遅くてタイムアウトが発生している」
  • 処理速度の異なる2つのシステムを接続したい。片方がダウンしても注文を失いたくない」
  • バースト時にメッセージを蓄積して、バックエンドは自分のペースで処理したい」

アーキテクチャ

プロデューサー(Web API / EC2)
  → SQS キューにメッセージを送信(すぐに200 OK を返せる)

コンシューマー(EC2 / Lambda)
  → SQS から pull してメッセージを処理
  → Auto Scaling: キューの深さ(ApproximateNumberOfMessages)に応じてスケール
  → 処理成功 → メッセージ削除
  → 処理失敗 → Visibility Timeout 後に再試行 → DLQ へ

試験での正解条件

  • 「バックエンドの処理が遅いので Web API がタイムアウト」→ SQS で非同期化
  • 「バックエンドがダウンしてもメッセージを失いたくない」→ SQS(最大14日間保持)
  • 「バースト時に処理を平滑化したい」→ SQS + Auto Scaling(キュー深さに基づく)

6. パターン2:SQS FIFO で順序保証・重複排除

要件のキーワード

  • 注文の処理順序が重要で、後から来た注文が先に処理されてはいけない」
  • 重複して注文が処理されてはいけない(二重課金・在庫の二重減算が困難)」
  • 厳密に1回だけ処理したい(Exactly-Once)」

アーキテクチャ:FIFO キューの使い分け

例:金融取引処理
  プロデューサー(取引受付)
    → SQS FIFO キュー(MessageGroupId: 口座ID)
    → コンシューマー(取引処理)

  MessageGroupId が同じメッセージ → 厳密に FIFO 順で処理
  MessageGroupId が異なるメッセージ → 並列処理(グループ間は並列 OK)

試験での正解条件

  • 「処理順序が重要(金融・在庫)」→ SQS FIFO + MessageGroupId
  • 「重複処理を防ぎたい」→ SQS FIFO(MessageDeduplicationId で自動重複排除)
  • 「高スループットかつ順序不要」→ SQS Standard(FIFO は 300 TPS 上限あり)

7. パターン3:SNS ファンアウト(1対多プッシュ)

要件のキーワード

  • 「注文が完了したら、在庫・配送・通知の3つのシステムを同時に動かしたい
  • 同じメッセージを複数のキュー・Lambdaに同時に届けたい
  • 「各システムが独立して受け取り・独立してスケールできるようにしたい」

アーキテクチャ:SNS + SQS ファンアウト

注文受付システム
  → SNS トピック「order-events」にパブリッシュ
    ↓(同時配信)
    ├── SQS キュー「inventory-queue」  → 在庫管理システム(Lambda)
    ├── SQS キュー「shipping-queue」   → 配送システム(EC2)
    └── SQS キュー「notify-queue」     → 通知サービス(Lambda)

各キューが独立してメッセージを保持・処理
→ 在庫システムが遅くても配送・通知は先に動く
→ 一部システムがダウンしても他は影響なし

なぜ SNS から直接 Lambda を複数呼ばないのか

SNS から Lambda を直接呼ぶことは可能だが、SQS を挟む理由がある。

直接呼び出し(SNS → Lambda)SNS + SQS ファンアウト
Lambda が即時実行(リトライは限定的)SQS がメッセージを保持(14日)しリトライ
Lambda の同時実行数上限に直撃しやすいSQS がバッファとなり Lambda を保護
処理失敗時のメッセージロストリスクありDLQ で失敗メッセージを隔離・調査可能

8. パターン4:EventBridge イベント駆動アーキテクチャ

要件のキーワード

  • AWS サービスのイベント(EC2 起動・S3 アップロード)をトリガーに処理を走らせたい
  • SaaS(Datadog・Zendesk)のイベントを受け取って自動対応したい」
  • 「イベントの JSON フィールドの値によって宛先を動的に切り替えたい
  • 定期バッチを CloudWatch Events のスケジュールで実行していたが、EventBridge に移行したい」

アーキテクチャ:EventBridge ルールによるルーティング

イベントソース
  ├── AWS サービス(EC2・S3・CodePipeline 等)→ デフォルトバス
  ├── カスタムアプリ(PutEvents API)→ カスタムバス
  └── SaaS(Datadog・Zendesk 等)→ パートナーバス

EventBridge イベントバス
  ↓(ルールでマッチング)
  ├── ルール1: {source: "aws.ec2", detail-type: "EC2 Instance State-change"} → Lambda
  ├── ルール2: {source: "myapp", detail.type: "order.created"} → SQS
  └── ルール3: スケジュール(rate(1 day)) → Step Functions

EventBridge vs SNS の選択基準

判断ポイントEventBridgeSNS
ルーティングの複雑さJSON フィールドの深い値でマッチング属性ベースのフィルタリング(SNS フィルタポリシー)
SaaS 連携パートナーバスで直接受信対応なし
クロスアカウントイベントバスポリシーでアカウント間配信対応なし(同一アカウント内のみ)
スケジュールcron/rate 式でスケジュール実行対応なし
ターゲット数1ルールに最大5ターゲットサブスクライバー無制限
ユースケースAWS サービス連携・SaaS・複雑なルーティングシンプルなファンアウト・通知

9. 要件キーワード早見表

要件キーワード正解パターン選んではいけない
「非同期・疎結合・バッファ」SQS同期 API 呼び出し(密結合)
「処理順序が重要・重複排除」SQS FIFOSQS Standard(順序不保証・重複あり)
「高スループット(数万 TPS)+ 順序」Kinesis Data StreamsSQS FIFO(300 TPS 上限)
「複数システムに同じメッセージ・同時配信」SNS ファンアウトSQS(1対1配信)
「ファンアウト + 耐障害性・リトライ」SNS + SQS 組み合わせSNS → Lambda 直接(保持なし)
「AWS サービスのイベントをトリガーに処理」EventBridge(デフォルトバス)SNS(AWS サービスイベントは EventBridge が主流)
「SaaS(Datadog/Zendesk)のイベントを受け取る」EventBridge パートナーバスSNS(対応なし)
「イベントの JSON フィールドで宛先を動的切り替え」EventBridge ルールSNS(属性ベースのみ)
「定期バッチ実行(cron/rate)」EventBridge スケジュールSQS(スケジュール機能なし)
「処理失敗メッセージを隔離・調査」SQS DLQメッセージ削除(ロストする)
「Long Polling でコストを下げたい」SQS Long PollingShort Polling(空レスポンス多発)

10. 頻出ひっかけパターンと正しい打ち手

ひっかけ1:SNS はメッセージを保持すると思い込む

誤り: 「SNS にメッセージをパブリッシュすれば、コンシューマーが後からいつでも取り出せる」
正解: SNS はメッセージを保持しない。コンシューマーが受け取れなかったメッセージはロストする。SNS + SQS のファンアウトパターンで SQS がメッセージを保持する構成が必要だ。

ひっかけ2:SQS FIFO を「すべての順序保証に使う」と思い込む

誤り: 「大量のリアルタイムログを順序通りに処理したい → SQS FIFO」
正解: SQS FIFO は 300 TPS(バッチで3,000 TPS)が上限。毎秒数万件の高スループットで順序保証が必要なら Kinesis Data Streams(シャードキーでパーティション内順序保証)が正解だ。

ひっかけ3:SNS と EventBridge を混同する

誤り: 「EC2 インスタンスの状態変化イベントを SNS トピックで直接受け取る → SNS」
正解: EC2 の状態変化イベントは EventBridge(旧 CloudWatch Events)のデフォルトバスに自動的に流れる。SNS は「通知先」であり、EventBridge → SNS の順に使うのが正しい構成だ。

ひっかけ4:SQS を「1対多」に使おうとする

誤り: 「SQS キューのメッセージを3つのシステムが同時に受け取る → SQS 1つ」
正解: SQS は1つのメッセージを1つのコンシューマーだけが取り出す(他のコンシューマーには見えなくなる)。**1対多は SNS ファンアウト + SQS(サブスクライバーごとに個別キュー)**を使う。


11. 次のアクション チェックリスト

  • SQS Standard と FIFO の配信保証・順序・スループットの違いを言える
  • SQS の Visibility Timeout と DLQ の役割を説明できる
  • SNS ファンアウトパターン(SNS + SQS)のアーキテクチャを図示できる
  • SNS がメッセージを保持しないことを理解した
  • EventBridge のデフォルトバス・カスタムバス・パートナーバスの違いを言える
  • EventBridge と SNS の選択基準(複雑なルーティング・SaaS 連携・スケジュール)を押さえた
  • 「SQS FIFO は 300 TPS 上限」と「高スループット順序保証は Kinesis」を即答できる
  • SNS + SQS FIFO ファンアウトには SNS FIFO トピックが必要なことを理解した
  • SAA Kinesis 設計パターン で高スループット順序処理との違いを確認した

12. 関連記事


13. 関連サイト

出典・参考情報