Amazon SQS でキューを作り、SNS との違いを体験する
記事の「実践」を 1 項目ずつ進めるためのページです。AWS マネジメントコンソールで操作したら、右の一覧にチェックを入れてください。チェックはこのブラウザに保存されます。
準備 12 項目中 1 番目
前提条件
- リージョン:
ap-northeast-1(東京) - AWS マネジメントコンソールにログイン済みで、Amazon SQS と Amazon SNS を操作できる IAM 権限があること
- 事前に作成しておくリソースはありません
準備 12 項目中 2 番目
作成するリソース一覧
| リソース種別 | リソース名 | 用途 |
|---|---|---|
| SQS 標準キュー | handson-orders-queue | 送受信・可視性タイムアウトの確認用(ソースキュー) |
| SQS 標準キュー | handson-orders-dlq | handson-orders-queue のデッドレターキュー |
| SNS スタンダードトピック | handson-order-events | ファンアウトの発行元 |
| SQS 標準キュー | handson-shipping-queue | ファンアウトの受け手(発送用) |
| SQS 標準キュー | handson-billing-queue | ファンアウトの受け手(請求用) |
手順 12 項目中 3 番目
標準キューを作成する
- AWS マネジメントコンソールにログインし、リージョンが
ap-northeast-1(東京)であることを確認します - 上部の検索バーに
SQSと入力し、表示された「Simple Queue Service」を選択します - 「キューを作成」をクリックします
- 「詳細」で以下を設定します
- タイプ:
標準(デフォルト) - 名前:
handson-orders-queue
- タイプ:
- 「設定」で以下を設定します
- 可視性タイムアウト:
1と入力し、右隣の単位を「分」にします(後の手順で「見えない時間」を確かめやすくするため、既定の 30 秒から延ばします) - その他の項目(メッセージ保持期間
4 日、配信遅延0 秒、メッセージ受信待機時間0 秒など)はデフォルトのままにします
- 可視性タイムアウト:
- 「暗号化」「アクセスポリシー」「デッドレターキュー」などその他の項目はデフォルトのままにします(暗号化は、既定で Amazon SQS キー(SSE-SQS)によるサーバー側の暗号化が有効になっています。このままで、後の手順で SNS から届くメッセージも受け取れます)
- ページ下部の「キューを作成」をクリックします
キューの詳細画面が表示され、「詳細」に URL と ARN が表示されていることを確認します。
手順 12 項目中 4 番目
メッセージを送信・受信・削除する
- キューの詳細画面の右上で「メッセージを送受信」をクリックします
- 「メッセージを送信」で、メッセージ本文に
order-001: banana x 3と入力します - 「メッセージを送信」をクリックします
- 「メッセージを送信」セクションの上部に、「メッセージは送信済みであり、受信可能です。」と表示されます
- 同じ画面の下部「メッセージを受信」で「メッセージをポーリング」をクリックします(「ポーリング期間」の既定値は
30秒で、進行状況バーが 100% になるまでポーリングが続きます) - 「メッセージ」の一覧に、送信したメッセージ(ID と受信数
1)が表示されます - メッセージが表示されたら「ポーリングを停止」をクリックします。コンソールは、ポーリングを止める(または期間が終わる)と受信したメッセージを再び受信できる状態に戻します
- メッセージ ID をクリックすると、「本文」タブで
order-001: banana x 3が確認できます。確認できたら「完了」をクリックして閉じます
- 一覧で受信したメッセージのチェックボックスを選択し、一覧の右上の「削除」をクリックします
- 「メッセージ を削除」ダイアログで「削除」をクリックします
メッセージは受信しただけではキューから消えず、コンシューマーが削除して初めて消えることが確認できます。
手順 12 項目中 5 番目
可視性タイムアウト中は見えないことを確認する
コンソールは、ポーリングを止める(または期間が終わる)と受信したメッセージを再び受信できる状態に戻します。そのため、「ポーリングを終えてから、すぐにもう一度ポーリングする」やり方では、可視性タイムアウトの動きを確かめられません。ここでは、ポーリング期間を可視性タイムアウトより長い 90 秒にして、1 回のポーリングの途中で受信数がどう変わるかを見ます。
- 「メッセージを受信」の「ポーリング設定を編集」をクリックします
- 「ポーリング期間」を
90(秒)に変更し、「保存」をクリックします(この設定はブラウザに保持され、画面を開き直しても残ります) - 「メッセージを送信」で、メッセージ本文に
order-002: banana x 5と入力し、「メッセージを送信」をクリックします - 「メッセージをポーリング」をクリックし、
order-002のメッセージが受信数1で表示されることを確認します(今回は「ポーリングを停止」も削除もせず、そのまま待ちます) - ポーリングを開始してから 30 秒ほどたった時点でも、受信数が
1のままであること、「利用可能なメッセージ」が0であることを確認します。可視性タイムアウト(1 分)の間は、ポーリングを続けていても同じメッセージが再び届きません
- さらに待ち、ポーリングを開始してから 1 分を少し過ぎたころに、
order-002の受信数が2に増えることを確認します - 確認できたら「ポーリングを停止」をクリックし、
order-002を選択して「削除」します
手順 12 項目中 6 番目
デッドレターキューを設定する
まず、デッドレターキューにする標準キューを作成します。
- 左側ナビゲーションの「キュー」を選択し、「キューを作成」をクリックします
- 以下を設定します
- タイプ:
標準 - 名前:
handson-orders-dlq - メッセージ保持期間:
14日(ソースキューの 4 日より長くします)
- タイプ:
- その他の項目はデフォルトのままにし、「キューを作成」をクリックします
次に、ソースキューにデッドレターキューを設定します。
- 左側ナビゲーションの「キュー」から
handson-orders-queueを選択し、右上の「編集」をクリックします - 「デッドレターキュー」セクションで「有効」を選択します
- 以下を設定します
- キューの選択: 「キュー ARN」のドロップダウンから
handson-orders-dlqの ARN を選択 - 最大受信数:
2(既定値は10)
- キューの選択: 「キュー ARN」のドロップダウンから
- ページ下部の「保存」をクリックします
手順 12 項目中 7 番目
最大受信数を超えたメッセージが移ることを確認する
handson-orders-queueの詳細画面で「メッセージを送受信」をクリックします- メッセージ本文に
order-003: broken orderと入力し、「メッセージを送信」をクリックします - 「メッセージをポーリング」をクリックし、
order-003が受信数1で表示されることを確認したら、「ポーリングを停止」をクリックします(削除しません) - もう一度「メッセージをポーリング」をクリックし、受信数
2で表示されることを確認したら、「ポーリングを停止」をクリックします(削除しません。コンソールはポーリングを止めると受信したメッセージを戻すので、1 分待つ必要はありません) - 3 回目として「メッセージをポーリング」をクリックし、
order-003が表示されないことを確認します(受信数が最大受信数2を超えるため、デッドレターキューに移されます)。確認できたら「ポーリングを停止」をクリックします
続いて、デッドレターキュー側を確認します。
- 左側ナビゲーションの「キュー」を選択し、
handson-orders-dlqの「利用可能なメッセージ」が1になっていることを確認します(件数の反映に少し時間がかかるときは、一覧の更新アイコンをクリックします) handson-orders-dlqを選択して「メッセージを送受信」をクリックし、「メッセージをポーリング」をクリックします- 受信したメッセージの ID をクリックし、「本文」タブで
order-003: broken orderが確認できることを確認します(受信数は、元のキューでの 2 回にデッドレターキューでの 1 回を加えた3と表示されます)
手順 12 項目中 8 番目
SNS ファンアウト用のキューを 2 つ作成する
- 左側ナビゲーションの「キュー」を選択し、「キューを作成」をクリックします
- タイプ:
標準、名前:handson-shipping-queueを設定し、その他の項目はデフォルトのまま「キューを作成」をクリックします - 同じ手順で、名前
handson-billing-queueの標準キューを作成します - 作成した 2 つのキューの詳細画面で、それぞれの ARN(
arn:aws:sqs:ap-northeast-1:<アカウントID>:handson-shipping-queueの形式)を控えておきます
手順 12 項目中 9 番目
SNS トピックを作成する
- 上部の検索バーに
SNSと入力し、表示された「Simple Notification Service」を選択します - 左側ナビゲーションの「トピック」を選択し、「トピックの作成」をクリックします
- 以下を設定します
- タイプ:
スタンダード(既定では「FIFO」が選ばれているので、「スタンダード」に切り替えます) - 名前:
handson-order-events
- タイプ:
- その他の項目はデフォルトのままにし、「トピックの作成」をクリックします
- トピックの詳細画面に表示される ARN(
arn:aws:sns:ap-northeast-1:<アカウントID>:handson-order-eventsの形式)を控えておきます
手順 12 項目中 10 番目
キューのアクセスポリシーで SNS からの送信を許可する
SNS トピックがキューにメッセージを送れるよう、2 つのキューのアクセスポリシーを編集します。
- SQS コンソールに戻り、左側ナビゲーションの「キュー」から
handson-shipping-queueを選択します - キューの詳細画面の「キューポリシー」タブ(既定で選ばれています)にある「アクセスポリシー」の「編集」をクリックします(画面右上の「編集」からも、同じ編集画面に進めます)
- 編集画面の「アクセスポリシー」セクションの JSON エディタで、既存のステートメント(キューの所有者を許可するもの)は残したまま、
"Statement"の配列に以下のステートメントを追加します。<アカウントID>は自分のアカウント ID に置き換えます
{
"Sid": "AllowSNSOrderEvents",
"Effect": "Allow",
"Principal": {
"Service": "sns.amazonaws.com"
},
"Action": "sqs:SendMessage",
"Resource": "arn:aws:sqs:ap-northeast-1:<アカウントID>:handson-shipping-queue",
"Condition": {
"ArnEquals": {
"aws:SourceArn": "arn:aws:sns:ap-northeast-1:<アカウントID>:handson-order-events"
}
}
}
- ページ下部の「保存」をクリックします
handson-billing-queueについても同じ手順で編集します。Resourceはarn:aws:sqs:ap-northeast-1:<アカウントID>:handson-billing-queueに置き換えます
手順 12 項目中 11 番目
2 つのキューをトピックにサブスクライブする
- SNS コンソールの左側ナビゲーションで「トピック」を選択し、
handson-order-eventsをクリックします - 「サブスクリプション」タブの「サブスクリプションの作成」をクリックします
- 以下を設定します
- トピック ARN:
handson-order-eventsの ARN が自動で入っていることを確認 - プロトコル:
Amazon SQS - エンドポイント: 入力欄をクリックして一覧から
handson-shipping-queueの ARN を選択(ARN を貼り付けてもかまいません)
- トピック ARN:
- その他の項目はデフォルトのままにし、「サブスクリプションの作成」をクリックします
- サブスクリプションの詳細画面が開き、ステータスが「確認済み」と表示されます(同じアカウントの SQS キューは、確認の操作なしで自動的に確認済みになります)
- トピックの詳細画面に戻り、同じ手順で、エンドポイントを
handson-billing-queueの ARN にしたサブスクリプションを作成します - トピックの詳細画面の「サブスクリプション」タブに、2 つの SQS サブスクリプションが表示され、ステータスが「確認済み」になっていることを確認します
手順 12 項目中 12 番目
1 回の発行で 2 つのキューに届くことを確認する
- トピック
handson-order-eventsの詳細画面で「メッセージの発行」をクリックします - 以下を入力します
- 件名:
new-order - メッセージ本文(「メッセージ本文」セクションの「エンドポイントに送信するメッセージ本文」):
order-100: banana x 10
- 件名:
- 「メッセージの発行」をクリックします
- SQS コンソールに戻り、左側ナビゲーションの「キュー」を選択します
handson-shipping-queueとhandson-billing-queueの「利用可能なメッセージ」が、どちらも1になっていることを確認します(件数の反映に少し時間がかかるときは、一覧の更新アイコンをクリックします)
handson-shipping-queueを選択して「メッセージを送受信」をクリックし、「メッセージをポーリング」をクリックします(メッセージが表示されたら「ポーリングを停止」をクリックします)- 表示されたメッセージの ID をクリックし、「本文」タブを確認します。SNS から届いたメッセージは JSON 形式で、
"Type" : "Notification"、"TopicArn"、"Subject" : "new-order"、"Message" : "order-100: banana x 10"などが含まれていることが確認できます
handson-billing-queueでも同様にポーリングし、同じ内容のメッセージが届いていることを確認します
1 回の発行で 2 つのキューに同じメッセージが届き、それぞれのキューから別々に受信できることが確認できます。