SAA / ドメイン2 レジリエントなアーキテクチャの設計
重要な内容
Amazon SNS (Simple Notification Service)
は、メッセージを publisher から複数の subscriber へ配信するためのマネージドな pub/sub メッセージングサービスです。 1 つの topic にメッセージを publish すると、、、/S、Email、SMS、Mobile Push、 など複数の購読先へ通知できます。
SAA では、SNS を「通知サービス」としてだけ覚えるのではなく、SQS との fanout、Lambda 連携、フィルターポリシー、Standard topic と topic、配信失敗時の 、 暗号化、 との使い分けを判断できることが重要です。
Point
- SNS = Simple Notification Service の略です。
- Notification は「通知」という意味です。
- SNS は「1 つのメッセージを複数の購読先へ通知するサービス」と覚えます。
- 和訳
- Simple: 単純な、簡単な
- Notification: 通知
- Service: サービス
- Weblio英和辞書「notification」
概要
は、イベントを発行する側と受け取る側をにするためのサービスです。 publisher は topic にメッセージを送るだけで、どの subscriber が受け取るかを直接意識しません。 subscriber は topic を購読し、自分に必要な通知を受け取ります。
SAA では、「1 つのイベントを複数の処理系へ配る」「 alarm をメール通知する」「 イベントやアプリケーションイベントを複数 consumer に配信する」「 を組み合わせて各 consumer の処理遅延を吸収する」といった文脈で出ます。
| 見るポイント | 代表的な判断 |
|---|---|
| 複数の購読先へ同じイベントを配るか | SNS topic を使います。 |
| 各購読先で独立して再試行・バッファリングしたいか | SNS + SQS fanout を使います。 |
| 購読先ごとに受け取るメッセージを絞りたいか | Subscription filter policy を使います。 |
| 順序や重複排除が必要か | SNS topic と SQS FIFO queue を検討します。 |
| 配信失敗を後で調査したいか | Subscription ごとに を設定します。 |
| 人への通知か | Email、SMS、Mobile Push を検討します。 |
主要技術
①Topic、Publisher、Subscriber
の中心は topic です。 Publisher は topic にメッセージを送信し、subscriber は topic を購読してメッセージを受け取ります。 Topic は、メッセージ配信の論理的な入口です。
| 要素 | 役割 | 試験での判断ポイント |
|---|---|---|
| Topic | メッセージの配信チャネル | 複数 subscriber へ同じイベントを配る単位です。 |
| Publisher | メッセージ発行元 | アプリケーション、、、 などが該当します。 |
| Subscription | Topic と endpoint の紐付け | 購読先ごとの配信方法やフィルターを設定します。 |
| Endpoint | 実際の配信先 | 、、/S、Email、SMS、Mobile Push などです。 |
SNS は push 型の配信です。 SQS のように consumer がキューから poll するのではなく、SNS が購読先へメッセージを配信します。 ただし、SQS を subscriber にすると、SNS が SQS にメッセージを入れ、後続の worker が自分のペースで処理できます。
⚠️ 頻出: 「1 つのイベントを複数の独立した処理先へ配信する」は SNS です。「1 つの処理待ち行列を worker が取り出す」は SQS です。
②Fanout と SQS 連携
の代表的な設計パターンは fanout です。 1 つの topic に publish されたメッセージを、複数の queue、、/S endpoint などへ同時に配信します。
SAA では、SNS 単体よりも SNS + SQS の組み合わせが頻出です。 各 subscriber 用に SQS queue を用意すると、処理系ごとに独立したバッファ、再試行、、スケーリングを持てます。
| 構成 | 用途 | 判断ポイント |
|---|---|---|
| SNS -> Lambda | すぐに関数を起動 | 軽量なイベント処理や通知処理に向きます。 |
| SNS -> SQS | バッファ付き非同期処理 | 処理遅延、障害、再試行を queue 側で吸収できます。 |
| SNS -> 複数 SQS | Fanout | 複数処理系が同じイベントを独立して処理できます。 |
| SNS -> HTTP/S | 外部システム通知 | Webhook 的な連携で使います。 |
| SNS -> Email/SMS | 人への通知 | 運用通知、アラート、ユーザー通知で使います。 |
SNS から SQS へ配信する場合、SQS queue policy で SNS topic からの sqs:SendMessage を許可します。
これを忘れると subscription はあってもメッセージ配信に失敗します。
⚠️ 頻出: 「複数システムへ同じイベントを配り、それぞれが独立して処理したい」は SNS + 複数 SQS queue です。1 つの SQS queue を複数処理系で共有すると、各メッセージは通常どれか 1 つの consumer に処理されます。
③Message filtering
の subscription filter policy を使うと、subscriber ごとに受け取るメッセージを絞れます。 デフォルトでは、subscriber は topic に publish されたすべてのメッセージを受け取ります。 フィルターを設定すると、メッセージ属性または 形式のメッセージ本文に基づいて、配信対象を制御できます。
| フィルター対象 | 用途 | 試験での判断ポイント |
|---|---|---|
| Message attributes | 属性値で配信先を分ける | eventType=order-created などで絞ります。 |
| Message body | JSON 本文の値で配信先を分ける | payload 内の項目で絞りたい場合に使います。 |
| フィルターなし | 全 subscriber に配信 | 全処理系が同じイベントを必要とする場合です。 |
フィルターを使うと、不要なメッセージを subscriber 側で捨てる処理を減らせます。 たとえば、注文、決済、配送、分析を同じ topic に publish し、各 subscription が必要なイベントだけを受け取る設計ができます。
ただし、フィルターに依存しすぎると、topic の意味が広がりすぎる場合があります。 ドメインが明確に異なるイベントは topic を分け、同じ topic 内の一部条件分岐には filter policy を使う、という設計が分かりやすいです。
⚠️ 頻出: 「同じ topic から subscriber ごとに必要なイベントだけ受け取りたい」は subscription filter policy です。subscriber 側で全部受け取って捨てるより効率的です。
④Standard topic と FIFO topic
topic には Standard topic と topic があります。 Standard topic は高で一般的な pub/sub に向きます。 FIFO topic は、順序と重複排除が必要なメッセージ配信に使います。
| Topic 種別 | 特徴 | 向いている用途 |
|---|---|---|
| Standard topic | 高スループット、少なくとも 1 回配信、順序はベストエフォート | 多くの通知、イベント配信、fanout |
| FIFO topic | メッセージグループ内順序、重複排除 | 注文状態、決済、順序が重要な業務イベント |
FIFO topic を使う場合、購読先も FIFO に対応した構成を選びます。 SNS FIFO topic から FIFO queue へ配信すると、順序を保った fanout パターンを作れます。 Standard topic から FIFO queue へ直接順序保証付きで配る、という考え方ではありません。
Point
- FIFO = First-In, First-Out の略です。
- 先に入ったメッセージを先に処理する考え方です。
- SNS FIFO と SQS FIFO を組み合わせると、順序が重要なイベントを複数処理系へ配りやすくなります。
- 和訳
- First: 最初の
- Out: 外へ
- Weblio英和辞書「first」
FIFO topic では、message group ID が順序を保つ単位になります。 同じ message group ID のメッセージは順序を保ち、異なる message group ID は並列性を高められます。 順序が必要な粒度を正しく設計することが重要です。
⚠️ 頻出: 「複数 subscriber へ同じイベントを配りたいが順序も必要」は SNS FIFO topic + SQS FIFO queue を検討します。順序不要で高スループットなら Standard topic が基本です。
⑤配信再試行、DLQ、監視
は subscription ごとにメッセージ配信を試みます。 配信先の endpoint が一時的に失敗する場合、SNS は再試行します。 それでも配信できないメッセージを失わず調査したい場合は、subscription に dead-letter queue を設定します。
| 機能 | 用途 | 試験での判断ポイント |
|---|---|---|
| Delivery retry | 一時的な配信失敗への再試行 | endpoint の一時障害に備えます。 |
| Subscription | 配信不能メッセージの隔離 | subscription 単位で DLQ を設定します。 |
| Delivery status logging | 配信成功・失敗の可視化 | Logs で配信状況を調査します。 |
| CloudWatch metrics | Publish 数、失敗数、DLQ など | や運用監視に使います。 |
SNS の DLQ は topic ではなく subscription に設定します。 配信失敗は subscription 単位で発生するため、どの endpoint への配信に失敗したかを追跡しやすくなります。 DLQ には SQS queue を使います。
/S endpoint、、SQS、Email、SMS、Mobile Push など、配信先によって再試行や失敗時の挙動は異なります。 試験では、配信失敗を調査・再処理したいなら subscription DLQ、複数処理系のを高めたいなら SNS + SQS を考えます。
Point
- DLQ = Dead-letter Queue の略です。
- 配信や処理に失敗したメッセージを隔離するキューです。
- SNS では subscription に DLQ を設定し、配信できなかったメッセージを SQS に保存します。
⚠️ 頻出: 「SNS から endpoint への配信失敗を後で調査したい」は subscription DLQ です。「subscriber の処理遅延を吸収したい」は SNS -> SQS の構成にします。
⑥セキュリティ、暗号化、アクセス制御
へのアクセスは ポリシーと topic policy で制御します。
Publisher には sns:Publish、管理者には topic 作成や subscription 管理の権限を付与します。
publish や AWS サービスからの publish では、topic policy で送信元を許可する設計が関係します。
| 観点 | 関連機能 | 判断ポイント |
|---|---|---|
| IAM policy | ユーザーやロールの操作権限 | publish、subscribe、管理操作をにします。 |
| Topic policy | topic 側のリソースベース制御 | クロスアカウントやサービス連携で使います。 |
| 保存時暗号化 | message body を キーで保護します。 | |
| 通信経路の保護 | 暗号化 topic では HTTPS と署名付きリクエストが必要です。 | |
| Endpoint | VPC から private に SNS へ到達 | インターネットを通らず publish したい場合に使います。 |
| Data protection policy | 機密データの検出・保護 | などの保護要件で検討します。 |
SNS のサーバー側暗号化は、topic 内に保存されるメッセージ本文を KMS で保護します。 Topic metadata、message metadata、 metrics などは暗号化対象ではありません。 SSE-KMS を使う場合、publisher や AWS サービスが KMS キーを使えるように、KMS キーポリシーと IAM 権限を確認します。
暗号化された SNS topic から暗号化された へ配信する場合も、KMS 権限が関係します。 SNS サービスプリンシパルが必要な KMS 操作をできないと、配信や DLQ 連携が失敗する可能性があります。
⚠️ 頻出: 「SNS topic を KMS で暗号化したのに publish できない」場合、sns:Publish だけでなく KMS キー権限とキーポリシーを確認します。
試験対策
SAA の 問題では、まず「1 つのイベントを複数の購読先へ配る必要があるか」を確認します。 複数 subscriber へ push 配信するなら SNS が候補です。 処理側が自分のペースで取り出すキューが必要なら 、複数の AWS サービス間イベントルーティングや 連携、イベントバスが必要なら も比較します。
SNS と SQS の組み合わせは頻出です。 SNS topic にイベントを publish し、複数の SQS queue が subscribe することで、各処理系が同じイベントを独立して処理できます。 処理遅延や一時障害は各 SQS queue に蓄積されるため、consumer ごとのスケーリングや を分けられます。
| 問題文のキーワード | 優先して考える機能 | 理由 |
|---|---|---|
| 1 つのイベントを複数処理系へ配信 | SNS topic | Pub/sub で複数 subscriber に配れます。 |
| 複数処理系が独立して再試行 | SNS + SQS fanout | 各 queue が独自にバッファと DLQ を持てます。 |
| 購読先ごとに必要なイベントだけ受信 | Subscription filter policy | message attributes または body で配信を絞れます。 |
| メールや SMS で通知 | SNS Email / SMS | 人への通知に使います。 |
| をイベントで起動 | SNS -> Lambda | Topic publish をきっかけに関数を実行できます。 |
| 配信失敗を後で調査 | Subscription DLQ | 配信不能メッセージを SQS に隔離できます。 |
| 順序保証付き fanout | SNS + SQS FIFO | Message group ID 単位で順序を保てます。 |
| でメッセージを保護 | SNS | Message body を保存時暗号化できます。 |
| から private に publish | Interface VPC Endpoint | インターネットを経由せず SNS に到達できます。 |
よくある誤答は、SNS と SQS の役割を混同することです。 SNS はメッセージを配る pub/sub サービスです。 SQS はメッセージをためて consumer が取り出す queue サービスです。 「複数の subscriber 全員に届けたい」なら SNS、「複数 worker のうち誰か 1 つが処理すればよい」なら SQS が基本です。
EventBridge との比較では、SNS はシンプルな高 pub/sub や A2P 通知に向きます。 EventBridge はイベントバス、ルール、SaaS 連携、スキーマ、細かいイベントルーティングに向きます。 問題文に「メール通知」「SMS」「fanout to SQS」「複数 subscriber へ即時通知」があれば SNS を優先して考えます。
コスト面では、publish 数、配信数、endpoint 種別、SMS 配信、KMS 利用、データ転送、 Logs などが影響します。 SAA では具体的な料金暗記より、fanout、フィルタリング、DLQ、暗号化、購読先ごとのを押さえます。