EventBridge と Step Functions

Amazon EventBridge は「何かが起きた」という知らせ(イベント)を受け取り、ルールに合う宛先へ振り分けるサービスです。AWS Step Functions は、複数の処理の順番・分岐・エラー時の対応をワークフローとして組み立てるサービスです。SAA では、イベント駆動型アーキテクチャとワークフローのオーケストレーションで問われます。

ひとことで言うと: EventBridge は「イベントの仕分け係」、Step Functions は「処理の段取り表を実行する現場監督」です。

たとえるなら、EventBridge は郵便の仕分け場で、届いた郵便を宛名(ルール)を見て各部署に回します。Step Functions は工程表を持った現場監督で、「A が終わったら B、失敗したら 3 回までやり直し、それでもだめなら C」と段取りどおりに作業を進めます。

このページで押さえる論点

イベント駆動型アーキテクチャの考え方

イベントとは「注文が確定した」「S3 にファイルが置かれた」「EC2 インスタンスが停止した」のような、状態の変化を知らせるデータです。イベント駆動型アーキテクチャでは、イベントを発行する側(プロデューサー)は「誰が受け取るか」を知らずにイベントを送り、関心のある側(コンシューマー)がそれを受け取って動きます。送る側と受ける側が互いを知らないので、あとから受け取り手を追加しても送る側は変更不要です。

SAA の試験ガイドでは「要件に基づいてイベント駆動型、マイクロサービス、多層アーキテクチャを設計する」「ワークフローオーケストレーション(AWS Step Functions など)」が挙がっています。イベントを「振り分ける」のが EventBridge、決まった手順で処理を「進める」のが Step Functions です。

EventBridge の仕組み

EventBridge の中心はイベントバス(イベントを受け取る通り道)です。イベントバスに届いたイベントは、ルールで評価され、条件に合えばターゲット(宛先)へ送られます。

SNS の購読者向けフィルターポリシー(「SQS と SNS」参照)も絞り込みができますが、EventBridge は AWS サービスや SaaS のイベントをそのまま受け取れ、ルールごとに多様な宛先へ振り分けられる点が特徴です。

再生型アニメ図解

イベントがルールで振り分けられる流れ

注文 イベントバス ルール A ルール B Lambda Step Functions SQS ✕ 条件に合わない

※簡略化しています: ルール A は「すべての注文確定イベント」、ルール B は「金額 10 万円以上の注文確定イベント」という想定です。配信の失敗と再試行、デッドレターキューは省略しています(「EventBridge の機能」で説明)。

EventBridge の機能

機能できること試験での使いどころ
EventBridge スケジューラcron 式・rate 式で定期的に、または指定日時に 1 回だけ、ターゲットを呼び出す「毎晩 2 時にバッチを実行」「EC2 を夜間に停止」。サーバーで cron を動かす必要がない
アーカイブとリプレイイベントを保存し(保持期間は既定で無期限、日数を指定可能)、あとから再送信する障害からの回復、新しい処理の検証のために過去のイベントを流し直す
再試行ポリシーと DLQターゲットへの配信に失敗すると、既定で最大 24 時間・185 回まで再試行。それでも届かないイベントは削除されるため、SQS のデッドレターキューを設定して残す「配信できなかったイベントを失いたくない」
クロスアカウント・クロスリージョン別のアカウントや別リージョンのイベントバスをターゲットにする複数アカウントのイベントを 1 つのアカウントに集めて監視・処理する
EventBridge PipesSQS・Kinesis・DynamoDB Streams などのソースから 1 対 1 でターゲットへつなぎ、途中でフィルター・加工できるポーリングや連携のコードを書かずにソースとターゲットをつなぐ
スキーマレジストリイベントの構造(スキーマ)を記録・検出し、コードのひな形を生成する開発者がイベントの形式を調べる手間を減らす

AWS サービスの状態変化(EC2 の停止、Auto Scaling のスケールアウト、CodePipeline の失敗など)や、CloudTrail に記録された API 呼び出しも、デフォルトイベントバスにイベントとして届きます。「特定の API が呼ばれたら通知したい」「セキュリティグループが変更されたら自動で元に戻したい」といった要件は、EventBridge のルールで Lambda や SNS を呼び出して実現します。

Step Functions の仕組み

Step Functions では、処理の流れをステートマシン(状態の遷移図)として定義します。定義には Amazon States Language(JSON 形式)を使い、コンソールのドラッグ&ドロップの画面(Workflow Studio)でも作れます。1 つ 1 つの箱をステートと呼びます。

ステート役割
Task処理を実行する(Lambda の呼び出し、DynamoDB への書き込み、ECS タスクの実行、Glue ジョブの開始など)
Choice条件で次のステートを分岐する(「在庫あり」なら発送、「なし」なら取り寄せ)
Parallel複数の処理を同時に実行し、すべて終わるのを待つ
Map配列の各要素に同じ処理を繰り返す。分散モードでは S3 上の大量のファイルを並列処理できる
Wait指定した時間、または指定した日時まで待つ
Pass / Succeed / Failデータを加工して次へ渡す/成功で終了/失敗で終了

Task ステートからは、Lambda を挟まずに多くの AWS サービスの API を直接呼び出せます(サービス統合)。「Lambda で SDK を呼ぶだけ」のコードを減らせるため、運用負荷の低い構成として選ばれます。各ステート間で受け渡すデータ(入出力)は最大 256 KiB です。大きなデータは S3 に置き、その場所だけを渡します。

Step Functions のエラー処理と人の承認待ち

複数の処理をつなぐと、途中の 1 つが失敗したときの対応が面倒になります。Step Functions では、エラー処理をコードではなくワークフローの定義に書けます。

操作できるシミュレーター

Retry と Catch で結果がどう変わるか

「決済」ステートが最初の何回か失敗する想定です。設定を変えて「▶ 実行」を押してください。

注文受付 決済 発送 返金・通知

※簡略化しています: 再試行の間隔(指数バックオフ)、エラーの種類ごとに Retry・Catch を分ける設定は省略しています。「決済」は Lambda などを呼ぶ Task ステートの想定です。

人の承認を待つ(コールバック)

「上長が承認したら次へ進む」のように、外部の応答を待ちたい場合は、Task ステートに .waitForTaskToken を付けます。Step Functions はタスクトークンを発行して一時停止し、承認メールのリンクなどから SendTaskSuccess(または SendTaskFailure)でトークンが返されると再開します。Standard ワークフローなら最長 1 年待てるため、数日かかる承認フローも扱えます。

Standard ワークフローと Express ワークフロー

項目StandardExpress
最大実行期間1 年5 分
実行のされ方exactly-once(各ステップは 1 回だけ。Retry を指定した場合を除く)非同期は at-least-once(重複して実行されうる)、同期は at-most-once
料金の考え方状態遷移の回数実行回数・実行時間・メモリ量
実行履歴Step Functions に保存(90 日間)。コンソールで経過を目で追える。1 回の実行の履歴は最大 25,000 イベントStep Functions には保存しない。見るには CloudWatch Logs へのログ記録を有効にする
向いている処理長時間の処理、人の承認待ち、二重実行が許されない処理(決済など)IoT データの取り込み、ストリーミングデータの変換など、短時間・大量の処理

見分け方: 「5 分を超える」「人の承認を待つ」「二重実行は困る」なら Standard、「短時間の処理を毎秒大量に」「コストを下げたい」なら Express です。

EventBridge・Step Functions・SNS・SQS の使い分け

4 つのサービスの仕組みの比較は「SQS と SNS」ページにまとめています。ここでは、問題文で迷いやすい組み合わせに絞って見分け方を整理します。

迷う組み合わせ見分け方
EventBridge か SNS かAWS サービス・SaaS のイベントを受ける、イベントの中身で細かく振り分ける、スケジュール実行やリプレイが必要 → EventBridge。メール・SMS で人に通知、大量の購読者へ一斉配信 → SNS
Step Functions か SQS か順番・分岐・エラー時の後始末を含む複数ステップを管理 → Step Functions。処理を溜めて平準化するだけ → SQS
Step Functions か Lambda 1 つか処理が長い(Lambda の実行時間の上限を超える)、途中で待つ、ステップごとに再試行したい → Step Functions で複数の処理に分ける
EventBridge と Step Functions の組み合わせ「イベントが起きたらワークフローを開始」は、EventBridge のルールのターゲットに Step Functions を指定する

問題文のキーワード → 選ぶべき答え

問題文の言い回し選ぶべき答えと理由
「EC2 の状態変化や API の呼び出しをきっかけに自動で処理」EventBridge のルール(デフォルトイベントバス)でターゲットを呼び出す
「SaaS アプリのイベントを AWS で処理」EventBridge のパートナーイベントバス
「毎日決まった時刻に Lambda を実行」「サーバーの cron をなくしたい」EventBridge スケジューラ(cron 式・rate 式)
「過去のイベントを再処理したい」EventBridge のアーカイブとリプレイ
「ターゲットに届かなかったイベントを失いたくない」ルールのターゲットに DLQ(SQS)を設定(既定の再試行は最大 24 時間・185 回)
「複数の Lambda を順番に実行し、失敗時は再試行や補償処理」Step Functions(Retry・Catch)
「上長の承認を待ってから処理を続ける」Step Functions のタスクトークン(.waitForTaskToken)、Standard ワークフロー
「S3 上の数百万件のファイルを並列処理」Step Functions の分散 Map
「短時間の処理を毎秒大量に、低コストで」Express ワークフロー(最大 5 分)
「最長で数日かかる」「二重実行してはいけない」Standard ワークフロー(最大 1 年、exactly-once)
「Lambda を書かずに DynamoDB や SNS を呼び出したい」Step Functions のサービス統合

引っかけポイント

まとめ: SAA 試験で押さえるポイント

確認問題

参考リンク

AWS 公式ドキュメント(外部サイトが開きます)。本文の数値はこれらで確認しています。