このチュートリアルでは、Amazon Simple Notification Service (SNS) のメッセージフィルタリング機能を活用する方法について学習します。このメッセージフィルタリング機能は、SNS トピックにサブスクライブするエンドポイントが、興味のあるトピックメッセージのサブセットのみを受信できるようにします。

今回の例では、ユーザーがウェブサイトにアクセスし、保険の見積もりリクエストを行います。これらのリクエストは、自動車保険、ボート保険、または生命保険のための見積もりです。保険の見積もりリクエストが発行されると、そのリクエストは一連のバックエンドシステムに転送されます。車やボートの車両保険を扱う販売システム、生命保険を扱う別の販売システム、およびすべての見積もりリクエストを処理する必要がある分析システムがあります。

Send Fanout Event Notifications のチュートリアルで学んだように、SNS と SQS でファンアウトメッセージングパターンを使ってバックエンドシステムからウェブサイトを切り離します。イベント通知を適切なバックエンドシステムに送信するには、見積もりリクエストの種類ごとに個別のトピックを作成し、メッセージルーティングロジックをパブリッシャーに追加します。しかしこのオプションは、非常に複雑なパブリッシャー、トピックの急増、SNS トピックのプロビジョニングと管理でのオーバーヘッドの追加をもたらす可能性があります。SNS メッセージのフィルタリングの方が、はるかに簡単です。

そこで、このチュートリアルでは Amazon SNS と Amazon Simple Queue Service (SQS) を使用します。どちらのサービスも AWS 無料利用枠に含まれています。

 

AWS でのメッセージのフィルタリングにはアカウントが必要です

無料アカウントの作成

AWS 無料利用枠では、Amazon Simple Notification Service で 1,000,000 件の発行、Amazon Simple Queue Service で 1,000,000 件のリクエストを無料でご利用いただけます。

AWS 無料利用枠の詳細はこちら »

 

まず、保険のウェブサイトで見積もりリクエストが発行されたときにメッセージを公開するための Amazon SNS トピックを作成します。これらのリードは、自動車保険、ボート保険、または生命保険に関連している可能性があります。 


a.ここをクリックすると、AWS マネジメントコンソールが新しいブラウザウィンドウで開くため、このステップバイステップガイドを開いたままで操作できます。画面が読み込まれたら、ユーザー名とパスワードを入力して作業を開始します。検索バーに「notification」と入力し、[Simple Notification Service] を選択してサービスのコンソールを開きます。

tmt_filter-messages-sent-to-topics_1a

(クリックして拡大)

tmt_filter-messages-sent-to-topics_1a

b.  SNS コンソールのランディングページが表示されたら、[概要から開始] をクリックします。このページが表示されない場合は、次の手順に進んでください。

1b-console-home

(クリックして拡大)

1b-console-home

c.  左側のメニューの [トピック] をクリックします。

1c-create-topic-nav-open

(クリックして拡大)

1c-dashboard

d.  [トピックの作成] をクリックします。

 

1d-No-topics

(クリックして拡大)

1d-No-topics

e.  [トピック名] フィールドに Insurance-Quote-Requests と入力し、下にスクロールして [トピックを作成] をクリックします。

 

1e-create-topic-nav-closed

(クリックして拡大)

1e-create-topic-nav-closed

f.  新しいトピックが [トピックの詳細] ページに表示されます。

 

1f-topic-insurence-quote-request-created-success

(クリックして拡大)

1f-topic-insurence-quote-request-created-success

各保険販売システムは、SNS トピックにサブスクライブしている対応するSQS メッセージキューからの見積もりリクエストをポーリングします。

最初のキューは、自動車とボートの両方の保険見積もりリクエストを処理します。 2 つ目のキューは生命保険のものを処理します。 3 つ目のキューはすべてを取り込みます。3 つ目のキューは、保険のタイプに関係なく、すべての見積もりリクエストを取り込んで、分析システムにフィードします。これらの設定は、SNS サブスクリプションのフィルターポリシーとして設定されます。

このステップでは、3 つのキューを作成し、それぞれを SNS トピックにサブスクライブします。


a.ここをクリックして、Amazon SQS コンソールを新しいブラウザウィンドウで開きます。SQS のランディングページが表示されたら、[今すぐ始める] をクリックします。それ以外の場合、次のステップに進みます。

 

tmt_filter-messages-sent-to-topics_2a

(クリックして拡大)

tmt_filter-messages-sent-to-topics_2a

b.  [新しいキューを作成] ページで Vehicle-Insurance-Quotes と入力します ([キュー名] フィールドに )。

[標準キュー] が選択されたままの状態にし、[キューをクイック作成] をクリックします。

 

tmt_filter-messages-sent-to-topics_2b

(クリックして拡大)

tmt_filter-messages-sent-to-topics_2b

c.  [新しいキューを作成] をクリックし、ステップ 2b を繰り返して、次の 2 つの追加キューを作成します。
Life-Insurance-Quotes
 と All-Quotes

 

tmt_filter-messages-sent-to-topics_2c

(クリックして拡大)

tmt_filter-messages-sent-to-topics_2c

d.  これで、3 つのキューすべてが SQS コンソールに一覧表示されます。

 

tmt_filter-messages-sent-to-topics_2d

(クリックして拡大)

tmt_filter-messages-sent-to-topics_2d

2 つの Amazon SQS キューを作成したので、この 2 つのキューで新しい注文の通知をブロードキャストする Amazon SNS トピックをサブスクライブする必要があります。


a.  キューのリストから、Vehicle-Insurance-Quotes キュー、Life-Insurance-Quotes キュー、All-Quotes キューを選択します。

[キュー操作] ドロップダウンの一覧から [SNS トピックへのキューのサブスクライブ] を選択します。

 

 

tmt_filter-messages-sent-to-topics_3a

(クリックして拡大)

tmt_filter-messages-sent-to-topics_3a

b.  [トピックへサブスクライブする] ダイアログボックスが表示されます。[トピックを選択する] ドロップダウンリストから、3 つのキューにサブスクライブする Insurance-Quote-Requests トピックを選択します。同じアカウントから SNS トピックを作成したため、トピックがリストに表示されます。

別のアカウントを使用して SNS トピックを作成した場合、トピック ARN を使用してサブスクライブできます。詳細については、Amazon SNS ドキュメント、または「Cross-Account Integration with SNS」のブログをご参照ください。

 

 

tmt_filter-messages-sent-to-topics_3b

(クリックして拡大)

tmt_filter-messages-sent-to-topics_3b

c.  [トピックリージョン] はそのままにし、[サブスクライブ] をクリックします。 

 

 

tmt_filter-messages-sent-to-topics_3c

(クリックして拡大)

tmt_filter-messages-sent-to-topics_3c

d.  [トピックのサブスクリプション結果] ダイアログボックスが表示されます。[OK] をクリックします。

tmt_filter-messages-sent-to-topics_3d

(クリックして拡大)

tmt_filter-messages-sent-to-topics_3d

SNS および SQS リソースをすべて作成しました。これで、SNS サブスクリプションにフィルターポリシーを設定する準備ができました。フィルターポリシーはシンプルな JSON ドキュメントで、SNS サブスクリプションの属性として設定されており、サブスクライバーが希望する通知のタイプを定義します。

フィルターポリシーのないサブスクリプションは SNS トピックに公開されたすべてのメッセージを受信するため、このシナリオでは All-Quotes キューにフィルターポリシーを設定する必要はありません。


a.  他のブラウザーウィンドウで Amazon SNS コンソールに戻り、[トピック] をクリックして、リージョン内のすべてのトピックのリストを検索します。

リストのトピック名 Insurance-Quote-Requests をクリックします。  

4a-topic-list

(クリックして拡大)

4a-topic-list

b.  これで、Insurance-Quote-Requests トピックの詳細ページが表示され、この SNS トピックにサブスクライブしているすべての SQS キューを確認できます。Vehicle-Insurance-Quotes キューを選択し、[編集] をクリックします。

4b-topic-detail-insurance-quote-request

(クリックして拡大)

4b-topic-detail-insurance-quote-request

c.  すると、[サブスクリプションを編集] ページが表示されます。矢印をクリックして、サブスクリプションフィルターポリシーを編集します。 

4c-edit-sub-insurance-quote-request

(クリックして拡大)

4c-edit-sub-insurance-quote-request

d.  表示されたダイアログボックスで、次の JSON オブジェクトを入力します。{"insurance_type": ["car", "boat"]}

[変更を保存] をクリックします。

4d-topic-edit-filter-car-boat

(クリックして拡大)

4d-topic-edit-filter-car-boat

e.  サブスクリプションフィルターポリシーが正常に作成されたことを確認する確認ダイアログが表示されます。

 

4e-sub-saved-success

(クリックして拡大)

4e-sub-saved-success

f.  次に、プロセスを繰り返して、フィルターポリシーを 2 つ目のキューに追加します。Life-Insurance-Quotes キューを選択し、[編集] をクリックします。

矢印をクリックして、サブスクリプションフィルターポリシーを編集します。

表示されたダイアログボックスで、次の JSON オブジェクトを入力します。{"insurance_type": ["life"]}

[変更を保存] をクリックします。

All-Quotes キューに関連するサブスクリプションのフィルターポリシーを設定する必要があります。このポリシーがないため、このキューはトピックに公開されたすべてのイベントを取り込みます。

4f-topic-edit-filter-life

(クリックして拡大)

4f-topic-edit-filter-life

では、テストしてみましょう。 このステップでは、トピックにメッセージを発行することにより、リード創出に関するウェブサイトから新しい保険見積もりリクエストをシミュレートできるようにします。

さまざまな属性でメッセージを公開するため、Amazon SNS のメッセージフィルタリングメカニズムの動作を確認できます。


a.  [Insurance-Quote-Requests トピック] ページで、[メッセージを公開] をクリックします。

5a-topic-detail-with-3subs-2

(クリックして拡大)

5a-topic-detail-with-3subs-2

b.  フォームに次の値を入力して、最初のメッセージを作成します。

[件名] に Insurance Quote Request #1 と入力します。

メッセージ構造で、選択したすべての配信プロトコルに同一のペイロードを残します。

エンドポイントに送信するメッセージ本文に、自動車保険の見積もりリクエストを表す次のテキストを入力します。
2017 ボルボ S60、モントリオール

[メッセージ属性] で

  • [文字列] を [タイプ] フィールドでクリックします。
  • insurance_type と [名前] フィールドで入力します。
  • 自動車と [] フィールドで入力します。

[メッセージを発行] をクリックします。

5b-publish-message-montreal-address

(クリックして拡大)

5b-publish-message-montreal-address

c.  [Insurance-Quote-Requests] トピックページに戻ります。もう一度 [メッセージを公開] をクリックし、次の値を使って 2 つ目のメッセージを作成します。

[件名] に Insurance Quote Request #2 と入力します。

メッセージ構造で、選択したすべての配信プロトコルに同一のペイロードを残します。

エンドポイントに送信するメッセージ本文に、自動車保険の見積もりリクエストを表す次のテキストを入力します。
男性、33 歳、バンクーバー

[メッセージ属性] で

  • [文字列] を [タイプ] フィールドでクリックします。
  • insurance_type と [名前] フィールドで入力します。
  • 生命と [] フィールドで入力します。

[メッセージを発行] をクリックします。

5c-publish-message-male33

(クリックして拡大)

5c-publish-message-male33

d.  [Insurance-Quote-Requests] トピックページに戻ります。もう一度 [メッセージを公開] をクリックし、次の値を使って 2 つ目のメッセージを作成します。

[件名] に Insurance Quote Request #3 と入力します。

メッセージ構造で、選択したすべての配信プロトコルに同一のペイロードを残します。

エンドポイントに送信するメッセージ本文に、自動車保険の見積もりリクエストを表す次のテキストを入力します。
タウンハウス、1500 sq ft、トロント

[メッセージ属性] で

  • [文字列] を [タイプ] フィールドでクリックします。
  • insurance_type と [名前] フィールドで入力します。
  • 住宅と [] フィールドで入力します。

[メッセージを発行] をクリックします。

5d-publish-message-toronto-address

(クリックして拡大)

5d-publish-message-toronto-address

発生したメッセージ配信を検査し、保険見積もりリクエストの各種類が対応する SQS メッセージキューにルーティングされたことを確認しましょう。

対応する SNS サブスクリプションにこの着信メッセージの属性と一致するフィルターポリシーがあった場合にだけ、Amazon SQS キューへのサブスクリプションがメッセージを受信したことがわかります。

特に 1 つのキューが、トピックに公開されたすべてのメッセージを実際に受信したことにも気づくでしょう。これは、このサブスクリプションにフィルターポリシーが設定されていないために発生した、キャッチオール動作です。


a.  Amazon SQS コンソールにアクセスするVehicle-Insurance-Quotes キューを選択し、[キュー操作] をクリックします。

[メッセージを表示/削除] をクリックします。 

tmt_filter-messages-sent-to-topics_6a

(クリックして拡大)

tmt_filter-messages-sent-to-topics_6a

b.  [メッセージのポーリングを開始] をクリックします。

自動車保険の見積もり (保険見積もりリクエストの #1) に関連するこのキューにプッシュされたメッセージは、1 つだけであることに注意してください。ダイアログボックスを閉じます。

tmt_filter-messages-sent-to-topics_6b

(クリックして拡大)

tmt_filter-messages-sent-to-topics_6b

c.  2 つ目のキューについても同じ手順を繰り返します。Life-Insurance-Quotes キューのボックスをオンにします。[キュー操作] ドロップダウンの一覧から [メッセージの表示/削除] を選択します。

[メッセージのポーリングを開始] をクリックします。

その生命保険の見積もり (保険見積もりリクエストの #2) に関連する別のメッセージが、このキューにプッシュされたことに注意してください

[閉じる] をクリックします。

tmt_filter-messages-sent-to-topics_6c

(クリックして拡大)

tmt_filter-messages-sent-to-topics_6c

d.  最後に、All-Quotes キューのボックスをオンにします。[キュー操作] をクリックして、[メッセージを表示/削除]、[メッセージのポーリングを開始] の順にクリックします。

3 つのメッセージすべてがこのキュー (保険見積もりリクエストの #1、#2、#3) にプッシュされたことに注意してください。

[閉じる] をクリックします。

tmt_filter-messages-sent-to-topics_6d

(クリックして拡大)

tmt_filter-messages-sent-to-topics_6d

このステップでは、このチュートリアルで作成したリソース (トピックサブスクリプション、トピック、キュー) を削除します。料金が発生しないように、使用していないリソースは削除することがベストプラクティスです。


a.  Amazon SNS コンソールで、 [トピック]、Insurance-Quote-Requests トピックリンクの順にクリックします。

ステップ 7a

(クリックして拡大)

ステップ 7a

b.  [Insurance-Quote-Requests トピック] の詳細ページで各サブスクリプションを選択し、[削除] をクリックします。

ダイアログボックスで [削除] をクリックし、削除されていることをを確認します。 

7b-topic-detail-with-3subs

(クリックして拡大)

7b-topic-detail-with-3subs

c.  [Insurance-Quote-Requests トピック] 詳細ページで、[削除] をクリックします。

ダイアログボックスで「delete me」と入力して削除を確認し、[削除] をクリックします。 

 

7c-topic-detail-no-sub

(クリックして拡大)

7c-topic-detail-no-sub

d.  Amazon SQS コンソールにアクセスするこのチュートリアルで使用する 3 つのキューをすべて選択し、[キュー操作]、[キューを削除] の順にクリックします。

ダイアログボックスで削除されていることを確認します。

tmt_filter-messages-sent-to-topics_7d

(クリックして拡大)

tmt_filter-messages-sent-to-topics_7d

e.  これで、AWS マネジメントコンソールからサインアウトすることができます。 

tmt_filter-messages-sent-to-topics_7e

(クリックして拡大)

tmt_filter-messages-sent-to-topics_7e

Amazon Simple Notification Service (SNS) でメッセージのフィルタリングを使用して、よりシンプルで効率化された pub/sub アーキテクチャを構築できるようになりました。

メッセージのフィルタリングにより、Amazon SNS トピックのサブスクライバーは、トピックに対して発行されたすべてのメッセージを受信するのではなく、関心があるメッセージのサブセットのみを選択して受信できます。この新しい手法により、受信者がメッセージのフィルタリングロジックを実装したり、発行者システムでメッセージのルーティングロジックを実装したりする設計の複雑さがなくなります。


Amazon Simple Notification Service と Amazon Simple Queue Service を使用してメッセージファンアウト通知を実装する方法を習得したので、以下のいずれかをクリックして、AWS でのクラウドメッセージングについてさらに詳しく学習しましょう。

詳細はこちら

アマゾン ウェブ サービス (AWS) でのメッセージトピックの機能、コンポーネント、ユースケースに関する概要を確認しましょう。

Amazon SNS ウェブページにアクセスする »

掘り下げる

開発者ガイドで、SNS トピックにメッセージフィルタリングを実装する方法の詳細を確認しましょう。

ドキュメントを読む »

実際の事例を見る

AWS SDK for Python を使用してメッセージフィルタリングを実装する方法に関する例が、こちらにあります。

ブログを読む »

はい
いいえ