マネジメントコンソールで学ぶ Pub/Sub メッセージング基礎
Amazon SNS は、パブリッシャーからサブスクライバーへメッセージを配信するマネージド型の Pub/Sub サービスです。1 件のメッセージを複数の宛先(SQS・Lambda・HTTP・メール等)へ 同時に配信できます。
| 特徴 | 説明 |
|---|---|
| プッシュ型 | SNS がサブスクライバーへ能動的に配信する |
| Fan-out | 1 トピックに複数サブスクライバーを登録し、同時配信できる |
| サブスクライバー種別 | SQS / Lambda / HTTP(S) / Email / SMS / Kinesis Data Firehose |
| メッセージ保持 | 配信後は保持しない(失敗時の再配信は設定による) |
Amazon SQS は、メッセージを一時的に蓄えるマネージド型のメッセージキューです。 送信側と受信側を非同期に分離し、受信側が自分のペースでメッセージを取り出せます。
| 特徴 | 説明 |
|---|---|
| プル型 | コンシューマー側がキューをポーリングしてメッセージを取得する |
| メッセージ保持 | 最大 14 日間メッセージを保持(デフォルト 4 日) |
| Standard / FIFO | Standard は高スループット・順序不保証、FIFO は順序保証・重複排除 |
| Visibility Timeout | 取得中のメッセージを他のコンシューマーから一時的に見えなくする時間 |
| DLQ | 処理失敗メッセージを別キューへ転送する Dead Letter Queue 機能 |
| 観点 | SNS | SQS |
|---|---|---|
| 配信方式 | プッシュ(SNS → サブスクライバー) | プル(コンシューマーが取得) |
| メッセージ保持 | なし(配信後消える) | あり(最大 14 日) |
| 複数受信者 | できる(Fan-out) | 1 件は 1 コンシューマーが処理 |
| 主なユースケース | 通知・イベント配信 | ジョブキュー・処理バッファ |
SNS 単体では「サブスクライバーが落ちていたらメッセージが消える」という課題があります。 SNS の後段に SQS を置くことで、受信側が停止中もメッセージをキューに蓄積でき、 耐障害性が高まります。これが Fan-out パターンの基本形です。
注文受付システムを想定した、シンプルな SNS → SQS の Pub/Sub 構成を作ります。
handson-order-topichandson-order-queue| リソース種別 | 名前 | 備考 |
|---|---|---|
| SQS キュー | handson-order-queue | Standard キュー |
| SNS トピック | handson-order-topic | Standard トピック |
| SNS サブスクリプション | — | トピック → キュー の紐付け |
本ハンズオンでは 東京リージョン(ap-northeast-1) を使用します。
最低限、以下のポリシーがアタッチされていることを確認してください。
| ポリシー名 | 用途 |
|---|---|
AmazonSNSFullAccess | SNS トピック・サブスクリプションの作成・操作 |
AmazonSQSFullAccess | SQS キューの作成・メッセージ送受信 |
AdministratorAccess ポリシーがあれば上記の確認は不要です。
最初に SQS キューを作成します。SNS トピックより先に作成するのは、 後のサブスクリプション設定でキューの ARN が必要になるためです。
| 項目 | 値 | 説明 |
|---|---|---|
| 可視性タイムアウト | 30 秒 | メッセージ取得後、他から見えなくなる時間 |
| メッセージ保持期間 | 4 日 | メッセージをキューに保持する最大期間 |
| 配信遅延 | 0 秒 | メッセージが見えるようになるまでの遅延 |
| メッセージの最大サイズ | 256 KB | 1 件のメッセージの最大サイズ |
| メッセージ受信待機時間 | 0 秒 | 0 = ショートポーリング(今回はデフォルトのまま) |
今回はすべてデフォルト値のまま進みます。
arn:aws:sqs:ap-northeast-1:<アカウントID>:handson-order-queue
arn:aws:sns:ap-northeast-1:<アカウントID>:handson-order-topic
| 項目 | Standard | FIFO |
|---|---|---|
| スループット | ほぼ無制限 | 最大 300 件/秒(バッチで 3,000 件/秒) |
| メッセージ順序 | ベストエフォート(保証なし) | 送信順に配信 |
| 重複 | まれに重複あり | 重複排除あり |
| 主なユースケース | 高スループットな通知・イベント | 金融・在庫など順序重要な処理 |
SNS トピックに SQS キューをサブスクライブ(購読)させます。 これにより、トピックへのメッセージが自動的にキューへ転送されるようになります。
arn:aws:sns:ap-northeast-1:<アカウントID>:handson-order-topic
SNS が SQS へメッセージを送信するには、SQS キューのアクセスポリシーで SNS トピックからの
SendMessage を許可する必要があります。
マネジメントコンソールからサブスクリプションを作成した場合、 このポリシーは自動的に付与されるため、通常は手動設定は不要です。 もしエラーになる場合は、次の手順でポリシーを確認してください。
{
"Effect": "Allow",
"Principal": { "Service": "sns.amazonaws.com" },
"Action": "SQS:SendMessage",
"Resource": "arn:aws:sqs:ap-northeast-1:<アカウントID>:handson-order-queue",
"Condition": {
"ArnEquals": {
"aws:SourceArn": "arn:aws:sns:ap-northeast-1:<アカウントID>:handson-order-topic"
}
}
}
SNS トピックにメッセージをパブリッシュし、SQS キューに届いていることを確認します。
{
"orderId": "ORD-001",
"item": "商品A",
"quantity": 2,
"price": 5000
}
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx がパブリッシュされました。」
と表示されれば送信成功です。
Message フィールドに入力したメッセージ本文が含まれています。
{
"Type": "Notification",
"MessageId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"TopicArn": "arn:aws:sns:ap-northeast-1:<アカウントID>:handson-order-topic",
"Subject": "新規注文",
"Message": "{\n \"orderId\": \"ORD-001\",\n \"item\": \"商品A\",\n \"quantity\": 2,\n \"price\": 5000\n}",
"Timestamp": "2026-06-12T00:00:00.000Z",
"SignatureVersion": "1",
"Signature": "...",
"UnsubscribeURL": "https://..."
}
Type・TopicArn・Timestamp
等のメタデータに包まれています。実際のアプリケーションでは Message フィールドをパースして
本文を取り出します。
SNS から複数のメッセージを送ってみましょう。SQS キューに蓄積されていく様子が確認できます。
orderId: "ORD-002")で 3 件ほど送信します。
SQS でメッセージを受信(ポーリング)すると、そのメッセージは可視性タイムアウト(デフォルト 30 秒) の間、他のコンシューマーから見えなくなります。
この仕組みにより、複数のワーカーが同じメッセージを二重処理するのを防いでいます。 タイムアウト内に削除しなければ、メッセージはキューに戻り再度取得可能になります。
サブスクリプション → SNS トピック → SQS キュー の順に削除します。
handson-order-topic が消えていることを確認します。handson-order-queue が消えていることを確認します。| 学習ポイント | 内容 |
|---|---|
| SNS の役割 | メッセージを複数のサブスクライバーへ配信する Pub/Sub ハブ |
| SQS の役割 | メッセージを蓄積し、コンシューマーのペースで処理させるキュー |
| 組み合わせの効果 | 受信側が停止中もメッセージを保持できる耐障害性の高い非同期構成 |
| サブスクリプション | SNS トピックと SQS キューを紐付ける設定 |
| Visibility Timeout | メッセージ二重処理を防ぐ SQS の仕組み |