SNSの1トピックから複数Lambdaへのファンアウト、フィルタポリシーで振り分けられるか確認した

  • AWS
  • SNS
  • Lambda

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

何が起きたか

SNSの1トピックから複数のLambdaに送信できるか、さらにオプションで振り分けできるかを公式ドキュメントで整理した。

結論

  • SNSの1トピックに複数のLambdaをサブスクライブすれば、デフォルトで全購読者にメッセージがブロードキャストされる(ファンアウト)
  • サブスクリプションごとにフィルタポリシーを設定すれば、メッセージ属性の値によって受信するLambdaを振り分けられる
  • SNS→SQS→Lambdaという構成で分岐させるパターンも妥当

フィルタポリシーの仕組み

フィルタポリシーはサブスクリプション単位で設定する。デフォルトのFilterPolicyScopeはMessageAttributesで、メッセージ属性の値に対してマッチングする。

{
"target": ["lambda1"]
}

このポリシーをLambda1向けのサブスクリプションに設定しておけば、target属性がlambda1のメッセージだけがそのLambdaに配信される。他のLambdaには届かない。

フィルタポリシーの反映には最大15分かかることがあるらしい(結果整合性モデルのため)。実機での検証はまだしていない。

気づいた点

  • FilterPolicyScopeをMessageBodyにすれば、メッセージ属性だけでなくメッセージ本文(JSON)のプロパティでもフィルタできる。
  • メッセージ属性の型がString.Arrayの場合、Lambda宛の場合はStringとして渡されるという制約がある。地味だけど知らないとハマりそうなポイント。

振り分けの構成イメージ

flowchart LR
    A[Publisher] --> B[SNS Topic]
    B -->|target=lambda1| C[Lambda 1]
    B -->|target=lambda2| D[Lambda 2]

参考

  • Amazon SNS subscription filter policies(AWS公式ドキュメント)