AWS SNS / SQS 非同期処理ハンズオン

マネジメントコンソールで学ぶ Pub/Sub メッセージング基礎

Amazon SNS Amazon SQS マネジメントコンソール 所要時間 30〜45 分 v1.0

Amazon SNS / SQS とは

Amazon SNS (Simple Notification Service)

Amazon SNS は、パブリッシャーからサブスクライバーへメッセージを配信するマネージド型の Pub/Sub サービスです。1 件のメッセージを複数の宛先(SQS・Lambda・HTTP・メール等)へ 同時に配信できます。

特徴説明
プッシュ型SNS がサブスクライバーへ能動的に配信する
Fan-out1 トピックに複数サブスクライバーを登録し、同時配信できる
サブスクライバー種別SQS / Lambda / HTTP(S) / Email / SMS / Kinesis Data Firehose
メッセージ保持配信後は保持しない(失敗時の再配信は設定による)

Amazon SQS (Simple Queue Service)

Amazon SQS は、メッセージを一時的に蓄えるマネージド型のメッセージキューです。 送信側と受信側を非同期に分離し、受信側が自分のペースでメッセージを取り出せます。

特徴説明
プル型コンシューマー側がキューをポーリングしてメッセージを取得する
メッセージ保持最大 14 日間メッセージを保持(デフォルト 4 日)
Standard / FIFOStandard は高スループット・順序不保証、FIFO は順序保証・重複排除
Visibility Timeout取得中のメッセージを他のコンシューマーから一時的に見えなくする時間
DLQ処理失敗メッセージを別キューへ転送する Dead Letter Queue 機能

SNS と SQS の使い分け

観点SNSSQS
配信方式プッシュ(SNS → サブスクライバー)プル(コンシューマーが取得)
メッセージ保持なし(配信後消える)あり(最大 14 日)
複数受信者できる(Fan-out)1 件は 1 コンシューマーが処理
主なユースケース通知・イベント配信ジョブキュー・処理バッファ
SNS + SQS の組み合わせが強力な理由

SNS 単体では「サブスクライバーが落ちていたらメッセージが消える」という課題があります。 SNS の後段に SQS を置くことで、受信側が停止中もメッセージをキューに蓄積でき、 耐障害性が高まります。これが Fan-out パターンの基本形です。

今回構築するアーキテクチャ

注文受付システムを想定した、シンプルな SNS → SQS の Pub/Sub 構成を作ります。

注文発行者 (Publisher)
マネジメントコンソールから
SNS にメッセージをパブリッシュ
↓ Publish
SNS トピック
handson-order-topic
受け取ったメッセージをサブスクライバーへ配信
↓ Subscribe (SQS)
SQS キュー
handson-order-queue
メッセージを蓄積し、コンシューマーの取得を待機
↓ Receive
注文処理ワーカー (Consumer)
マネジメントコンソールから
SQS のメッセージを受信・確認

作成するリソース一覧

リソース種別名前備考
SQS キューhandson-order-queueStandard キュー
SNS トピックhandson-order-topicStandard トピック
SNS サブスクリプショントピック → キュー の紐付け

ハンズオンの流れ

① SQSキュー作成 ② SNSトピック作成 ③ SNS→SQS サブスクリプション ④ メッセージ送受信確認 ⑤ 後片付け

事前準備

必要なもの

使用リージョン

本ハンズオンでは 東京リージョン(ap-northeast-1) を使用します。

リージョンの確認・変更
1
AWS マネジメントコンソール右上のリージョン表示をクリックし、アジアパシフィック (東京) ap-northeast-1 を選択します。
注意: リージョンの統一
SNS トピックと SQS キューは同一リージョンに作成する必要があります。 作業中にリージョンが変わっていないか都度確認してください。

IAM 権限の確認

最低限、以下のポリシーがアタッチされていることを確認してください。

ポリシー名用途
AmazonSNSFullAccessSNS トピック・サブスクリプションの作成・操作
AmazonSQSFullAccessSQS キューの作成・メッセージ送受信
管理者権限を持つアカウントで実施する場合
AdministratorAccess ポリシーがあれば上記の確認は不要です。

ハンズオン①: SQS キューの作成

最初に SQS キューを作成します。SNS トピックより先に作成するのは、 後のサブスクリプション設定でキューの ARN が必要になるためです。

Step 1: SQS コンソールを開く

SQS サービスへ移動
1
マネジメントコンソール上部の検索バーに SQS と入力し、 Simple Queue Service をクリックします。
サービス検索 → Simple Queue Service
2
左側メニューの キュー をクリックします。

Step 2: キューを作成する

「キューの作成」ボタンをクリック
1
右上の 「キューの作成」 ボタンをクリックします。

Step 3: キューの設定を入力する

基本設定
1
タイプスタンダード を選択します(デフォルト)。
2
名前 に以下を入力します。
名前 handson-order-queue
設定パラメータ(デフォルトのまま)
項目説明
可視性タイムアウト30 秒メッセージ取得後、他から見えなくなる時間
メッセージ保持期間4 日メッセージをキューに保持する最大期間
配信遅延0 秒メッセージが見えるようになるまでの遅延
メッセージの最大サイズ256 KB1 件のメッセージの最大サイズ
メッセージ受信待機時間0 秒0 = ショートポーリング(今回はデフォルトのまま)

今回はすべてデフォルト値のまま進みます。

Step 4: キューを作成する

作成ボタンをクリック
1
ページ下部の 「キューの作成」 ボタンをクリックします。
2
作成完了後、キューの詳細画面に遷移します。

Step 5: キューの ARN を確認・メモする

ARN のコピー
1
キュー詳細画面の 「詳細」タブ を開き、ARN をコピーします。
形式: arn:aws:sqs:ap-northeast-1:<アカウントID>:handson-order-queue
2
コピーした ARN をメモ帳等に保存しておきます(次のハンズオンで使用します)。
確認ポイント
キューの一覧に handson-order-queue が表示されていれば成功です。 ステータスが 「アクティブ」 になっていることを確認してください。

ハンズオン②: SNS トピックの作成

Step 1: SNS コンソールを開く

SNS サービスへ移動
1
マネジメントコンソール上部の検索バーに SNS と入力し、 Simple Notification Service をクリックします。
サービス検索 → Simple Notification Service
2
左側メニューの トピック をクリックします。

Step 2: トピックを作成する

「トピックの作成」ボタンをクリック
1
右上の 「トピックの作成」 ボタンをクリックします。

Step 3: トピックの設定を入力する

基本設定
1
タイプスタンダード を選択します。
2
名前 に以下を入力します。
名前 handson-order-topic
3
その他の項目はデフォルトのまま、ページ下部の 「トピックの作成」 ボタンをクリックします。

Step 4: トピックの ARN を確認・メモする

ARN のコピー
1
作成完了後に表示されるトピック詳細画面で ARN をコピーします。
形式: arn:aws:sns:ap-northeast-1:<アカウントID>:handson-order-topic
2
コピーした ARN をメモ帳等に保存します。
確認ポイント
トピックの一覧に handson-order-topic が表示されていれば成功です。
Standard と FIFO の違い
項目StandardFIFO
スループットほぼ無制限最大 300 件/秒(バッチで 3,000 件/秒)
メッセージ順序ベストエフォート(保証なし)送信順に配信
重複まれに重複あり重複排除あり
主なユースケース高スループットな通知・イベント金融・在庫など順序重要な処理
今回は Standard を使用します。

ハンズオン③: SNS → SQS サブスクリプションの設定

SNS トピックに SQS キューをサブスクライブ(購読)させます。 これにより、トピックへのメッセージが自動的にキューへ転送されるようになります。

Step 1: サブスクリプションを作成する

SNS トピック詳細画面からサブスクリプションを作成
1
SNS コンソール → トピックhandson-order-topic をクリックします。
2
トピック詳細画面下部の 「サブスクリプション」 タブをクリックします。
3
「サブスクリプションの作成」 ボタンをクリックします。

Step 2: サブスクリプションの設定を入力する

設定値の入力
1
トピック ARN が自動入力されていることを確認します。
arn:aws:sns:ap-northeast-1:<アカウントID>:handson-order-topic
2
プロトコル のドロップダウンから Amazon SQS を選択します。
3
エンドポイント に、ハンズオン① でコピーした SQS キューの ARN を貼り付けます。
エンドポイント arn:aws:sqs:ap-northeast-1:<アカウントID>:handson-order-queue
4
ページ下部の 「サブスクリプションの作成」 ボタンをクリックします。
エラーが出た場合: SQS キューのアクセスポリシー

SNS が SQS へメッセージを送信するには、SQS キューのアクセスポリシーで SNS トピックからの SendMessage を許可する必要があります。

マネジメントコンソールからサブスクリプションを作成した場合、 このポリシーは自動的に付与されるため、通常は手動設定は不要です。 もしエラーになる場合は、次の手順でポリシーを確認してください。

SQS アクセスポリシーの確認手順

1
SQS コンソール → handson-order-queueアクセスポリシー タブを開きます。
2
以下のようなステートメントが自動追加されていることを確認します。
{
  "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"
    }
  }
}

Step 3: サブスクリプションを確認する

ステータスの確認
1
サブスクリプションの一覧に戻り、ステータスが 「確認済み」 になっていることを確認します。
確認ポイント
  • サブスクリプションの ステータス が「確認済み」
  • プロトコル が「Amazon SQS」
  • エンドポイント が SQS キューの ARN と一致している
「確認済み」と「確認待ち」の違い
SQS をサブスクライバーにした場合、AWS が自動的に確認処理を行い即座に「確認済み」になります。 メールや HTTP エンドポイントの場合は、受信側での確認操作(メールのリンククリック等)が必要なため「確認待ち」になります。

ハンズオン④: メッセージの送受信確認

SNS トピックにメッセージをパブリッシュし、SQS キューに届いていることを確認します。

Step 1: SNS からメッセージをパブリッシュする

SNS コンソールからメッセージを送信
1
SNS コンソール → トピックhandson-order-topic をクリックします。
2
トピック詳細画面右上の 「メッセージのパブリッシュ」 ボタンをクリックします。
メッセージ内容の入力
1
件名 (オプション) に以下を入力します。
件名 新規注文
2
メッセージ本文「すべてのプロトコルで同じペイロードを送信する」 を選択します(デフォルト)。
3
メッセージ本文 テキストエリアに以下を入力します。
{
  "orderId": "ORD-001",
  "item": "商品A",
  "quantity": 2,
  "price": 5000
}
4
ページ下部の 「メッセージのパブリッシュ」 ボタンをクリックします。
送信成功の確認
「メッセージ ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx がパブリッシュされました。」 と表示されれば送信成功です。

Step 2: SQS キューにメッセージが届いているか確認する

SQS コンソールでキューを確認
1
SQS コンソール → キューhandson-order-queue をクリックします。
2
「モニタリング」タブ を開き、「利用可能なメッセージ数」1 になっていることを確認します。
※ メトリクス反映まで 1〜2 分かかる場合があります。

Step 3: SQS のメッセージを受信(ポーリング)する

「メッセージの送受信」機能でメッセージを取得
1
キュー詳細画面右上の 「メッセージの送受信」 ボタンをクリックします。
2
画面下部の 「メッセージをポーリング」 ボタンをクリックします。
3
メッセージ一覧にエントリーが表示されたら、メッセージ ID をクリック して内容を確認します。

Step 4: メッセージ内容を確認する

メッセージ詳細の確認
1
「本文」タブ を開きます。SNS がラップした JSON 形式でメッセージが届いています。
2
以下のような JSON が表示されていることを確認します。 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://..."
}
3
確認が終わったら 「完了」 ボタンをクリックしてダイアログを閉じます。
SNS がメッセージをラップする理由
SQS で受け取ったメッセージは、SNS が付加した TypeTopicArnTimestamp 等のメタデータに包まれています。実際のアプリケーションでは Message フィールドをパースして 本文を取り出します。

Step 5: メッセージを削除する

処理済みメッセージの削除(コンシューマーの動作をシミュレート)
1
メッセージ一覧でメッセージにチェックを入れ、「削除」 ボタンをクリックします。
2
確認ダイアログで 「削除」 をクリックします。
3
キューの 「利用可能なメッセージ数」0 に戻ることを確認します。
ハンズオン完了!
以下の一連の流れを体験できました。
  • SNS トピックへのメッセージパブリッシュ
  • SNS → SQS への自動転送(サブスクリプション)
  • SQS キューからのメッセージ受信・確認
  • 処理済みメッセージの削除

(応用)メッセージをさらに送ってみる

複数メッセージのパブリッシュ

SNS から複数のメッセージを送ってみましょう。SQS キューに蓄積されていく様子が確認できます。

1
Step 1 〜 Step 3 を繰り返し、異なる内容(例: orderId: "ORD-002")で 3 件ほど送信します。
2
SQS コンソールのキューで「利用可能なメッセージ数」が増えていることを確認します。
3
「メッセージをポーリング」して、複数のメッセージが取得できることを確認します。
Visibility Timeout の挙動を理解する

SQS でメッセージを受信(ポーリング)すると、そのメッセージは可視性タイムアウト(デフォルト 30 秒) の間、他のコンシューマーから見えなくなります。

この仕組みにより、複数のワーカーが同じメッセージを二重処理するのを防いでいます。 タイムアウト内に削除しなければ、メッセージはキューに戻り再度取得可能になります。

後片付け(リソースの削除)

作業終了後は必ずリソースを削除してください
SNS・SQS は無料枠内での利用ですが、不要なリソースは削除する習慣をつけましょう。

削除順序

サブスクリプション → SNS トピック → SQS キュー の順に削除します。

Step 1: SNS サブスクリプションを削除する

サブスクリプションの削除
1
SNS コンソール → 左側メニューの 「サブスクリプション」 をクリックします。
2
handson-order-topic に紐づくサブスクリプションにチェックを入れ、 「アクション」→「削除」 をクリックします。
3
確認ダイアログで 「削除」 をクリックします。

Step 2: SNS トピックを削除する

トピックの削除
1
SNS コンソール → 「トピック」 をクリックします。
2
handson-order-topic にチェックを入れ、「削除」 ボタンをクリックします。
3
確認ダイアログに 「これを削除」 と入力し、「削除」 ボタンをクリックします。

Step 3: SQS キューを削除する

キューの削除
1
SQS コンソール → 「キュー」 をクリックします。
2
handson-order-queue にチェックを入れ、「削除」 ボタンをクリックします。
3
確認ダイアログにキュー名 handson-order-queue を入力し、「削除」 をクリックします。

Step 4: 削除を確認する

リソースが消えていることを確認
1
SNS コンソールの 「トピック」 一覧から handson-order-topic が消えていることを確認します。
2
SQS コンソールの 「キュー」 一覧から handson-order-queue が消えていることを確認します。
後片付け完了
全リソースが削除されました。お疲れ様でした!

ハンズオンのまとめ

学習ポイント内容
SNS の役割メッセージを複数のサブスクライバーへ配信する Pub/Sub ハブ
SQS の役割メッセージを蓄積し、コンシューマーのペースで処理させるキュー
組み合わせの効果受信側が停止中もメッセージを保持できる耐障害性の高い非同期構成
サブスクリプションSNS トピックと SQS キューを紐付ける設定
Visibility Timeoutメッセージ二重処理を防ぐ SQS の仕組み

次のステップ

さらに学ぶには
  • Dead Letter Queue (DLQ) — 処理失敗メッセージを別キューへ転送して調査・リトライできる
  • Lambda との連携 — SQS をイベントソースとして Lambda を自動起動できる
  • Fan-out パターン — 1 つの SNS トピックに複数の SQS キューをサブスクライブして並列処理
  • FIFO キュー — 順序保証・重複排除が必要なユースケースへの対応
  • メッセージフィルタリング — サブスクリプションフィルターポリシーで特定メッセージのみ受信