
Amazon SNSでペイロードベースのメッセージフィルタリングができるようになりました
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、CX事業本部 IoT事業部の若槻です。
このたびのアップデートにより、Amazon SNSでペイロードベースのメッセージフィルタリングができるようになりました。
今までは、メッセージフィルタリング機能は「メッセージ属性(MessageAttributes)」のみサポートしていましたが、それに加えて今回「メッセージ本文(MessageBody)」も対象になった形となります。
やってみた
Amazon SNSのペイロードベースのメッセージフィルタリングを実際に試してみます。
設定
ペイロードベースのメッセージフィルタリングは、サブスクリプションフィルターポリシーで設定をします。(トピック側ではありません。)
フィルターを設定したいサブスクリプションを開きます。

[Subscription filter policy]で[Edit]をクリック。

[Subscription filter policy]がオフの場合はオンにします。

[Message body]でペイロードベースのフィルターポリシーをエディターで編集できるようになっています。(以前まではこのメニューでは属性ベースのフィルタリングのみ設定しか出来ませんでした。)

例として次のようなパターンのメッセージボディの受信を想定してみます。
{
"EventType": "NEW"
}
NEW:データ新規作成MODIFY:データ更新REMOVE:データ削除
今回はEventTypeがNEWの場合にのみ合致するポリシーを指定します。
{
"EventType": [
"NEW"
]
}

ペイロードベースのフィルターポリシーを設定できました。

サブスクリプションフィルターポリシーの詳しい記法についてはドキュメントをご覧ください。
ちなみにポリシーの形式が不正の場合は保存時にエラーとなります。
Couldn't set the filter policy for the subscription.
Error code: InvalidParameter - Error message: An error occurred while setting attribute subscription filter policy. Invalid parameter: FilterPolicy: Unrecognized match type eventName at [Source: (String)"{"Records":[{"eventName":["=","INSERT"]}]}"; line: 1, column: 27]

動作確認
ペイロードベースのメッセージフィルタリングポリシーが設定済みのサブスクリプションと、未設定のサブスクリプションが作成されたSNSトピックにメッセージを発行してみます。

まず設定したフィルタリングポリシーに合致するメッセージを発行した場合。
{
"EventType": "NEW"
}

するといずれのサブスクリプションにもメッセージが配信されました。

次に設定したフィルタリングポリシーに合致しないメッセージを発行した場合。
{
"EventType": "UPDATE"
}

今度はフィルタリングポリシー未設定のサブスクリプションにのみメッセージが配信されました。

フィルタリングポリシーが設定されたサブスクリプションへは、ポリシーが合致した場合にのみメッセージが配信されるという想定通りの動作を確認できました!
ユースケース
AWS Compute Blogでは、「S3 BucketイベントによりSNSトピックへ発行されたメッセージを、ペイロードに記述されたオブジェクトのプレフィクスやイベント名に応じてフィルタリング」するユースケースの実装が紹介されています。合わせて御覧ください。

参考
以上






