Amazon-Simple-Notification-Service-SNS

SNSでメッセージをフィルタしてSQSへ送信する

こんにちは。
クラウドビジネス部SRE課に所属しております、シタニシと申します。
今回はAmazon SNSでメッセージのフィルタリングを行いサブスクライブしているAmazon SQSへ送信するといった仕組みを簡単にですが書いてみました。

Amazon SNS トピックを作成する

AWSマネジメントコールにてSimple Notification Serviceを選択し、左カラムのトピックをクリックします。
[トピックの作成]ボタンをクリックして遷移した画面にて詳細欄の名前と表示名を入力し、右下の[トピックの作成]をクリックで完了です。
トピックのページで作成したトピックの詳細が確認できます。

Amazon SQS キューを作成する

今回の要件としては3つのキューを作成し、それぞれをSNSトピックにサブスクライブします。
SNSトピックにサブスクライブしている対応するSQSメッセージキューからのリクエストをポーリングします。
最初のキューは、自動車とボートの両方のりリクエストを処理します。
2 つ目のキューは生命保険のリクエストを処理します。
3 つ目のキューはすべてを取り込みます。

AWSマネジメントコールにてSimple Queue Serviceを選択し、[キューを作成]をクリックし遷移した画面にてキューの名前に[car_insurance_queue]を入力します。今回はその他の設定は変更しません。

同様に残り2つのキューを作成し、以下のように3つの名前のキューを作成します。

キューでトピックをサブスクライブする

作成した3つのキューを1つずつ選択し、アクション▲プルダウンから[Amazon SNS トピックにサブスクライブ]を選択します。

サブスクライブするトピックを選択するダイアログが表示されるので最初に作成したトピックを選択して保存します。

ここまででリソースの用意は完了になります。

フィルターポリシーをSNSサブスクリプションに設定する

Simple Notification Serviceより最初に作成したトピックを選択するとサブスクライブしているすべてのキューを確認できます。

[car_insurance_queue]キューを選択し、遷移した画面にて[編集]をクリックします。
[サブスクリプションフィルターポリシーオプション]を開き、JSONエディタに以下の内容を入力します。
ここでは車の情報を入力しています。

入力が完了し右下の[変更の保存]をクリックすると、正常に保存が完了したダイアログが表示されます。

同様に[Life_Insurance_queue]キューにフィルターポリシーを設定します。
設定内容は以下になります。

{
  "insurance_type": [
    "life"
  ]
}

All_queueキューはポリシーの設定を行わず、トピックに公開されたすべてのイベントを取り込むようにします。

ここまでで振り分けポリシーの設定は完了です。

トピックにメッセージを公開する

対象トピックのページにて[メッセージを公開]をクリックします。

遷移したページにてまずは件名に[Request #1]と入力します。
メッセージ本文には自動車のリクエストを表す次のテキストを入力します。
2017 volvo S60、Montreal

メッセージ属性には以下のように設定を行います。

入力が完了したら右下の[メッセージの発行]をクリックします。

同様にあと2つのメッセージ発行を行います。

2つ目の設定内容

件名:Request #2
本文:Male, 30 years old, Japan
属性:タイプ"String" 名前"insurance_type" 値"life"

3つ目の設定内容

件名:Request #3
本文:Townhouse, 1500 sq ft, Tronto
属性:タイプ"String" 名前"insurance_type" 値"home"

メッセージの配信を確認する

発行したメッセージがルーティングされたことを確認します。
Simple Queue Serviceのキュー一覧より[car_insurance_queue]を選択し、[メッセージの送受信]をクリックします。

遷移したページ下部の[メッセージをポーリング]をクリックすると対象キューにプッシュされたメッセージが1通のみ来ていることがわかります。

表示されたキューをクリックし本文タブをクリックするとルーティング通りのメッセージが対象として割り振られたことがわかります。

同様に[Life_Insurance_queue]も確認します。

[All_queue]に関してはすべてのイベントを取り込むとしていましたので、上記2通のメッセージに加えてどちらにも属さない3通目のメッセージ含めた3通が割り振られていることが確認できます。

以上で完了です!

最後に

今回はSNSでpublishしてのSQSへの連携の話でしたが、前段にLamdaを置けば何らかのイベントを受けてLamdaからSNSへpublishさせるといった方法があるので(これがよくある使い方かと)、こちらについても記事にしていきたいと思います。