SNSサブスクリプションフィルターの活用
投稿更新日: 2025/6/5

AWS SNS(Simple Notification Service)は、アプリケーション間でメッセージをやり取りするための強力なサービスです。SNSの特徴の一つに、特定の条件に基づいてメッセージをフィルタリングするサブスクリプションフィルタがあります。これにより、受信側でメッセージを効率的に振り分ける事が可能です。
この記事では、SNSサブスクリプションフィルターを使ったシステム構成と、そのフィルタリング方法について解説します。
1. 構成
SNSサブスクリプションフィルターを活用したシンプルな構成の例です。
- SNS → SQS → Lambda
ここでのポイントは、SNSが複数のSQSにメッセージを配信し、それぞれ異なるLambda関数がそのメッセージを処理するということです。SQSのキューにメッセージを送る際、SNSのサブスクリプションフィルターを使うことで、特定の属性や条件に基づいたメッセージの配信をコントロールできます。
2. メッセージ属性でのフィルタリング
SNSのメッセージ属性を利用して、特定の属性値を持つメッセージだけを特定のSQSに配送するように設定できます。
サブスクリプションフィルターポリシー例
次のポリシーでは、filterTypeという属性が「1」の場合にのみメッセージを受信します。
{ "filterType": ["1"] }
Lambda関数の例
Lambda関数からSNSにメッセージを送信する際に、フィルタリング対象となる属性を指定します。
import json import boto3 def lambda_handler(event, context): sns = boto3.client('sns') message = { 'type': '1', 'message': 'Hello from Lambda!', 'key1': 'val1', 'key2': 'val2', 'result': { 'alertType': 'warn' } } message_attributes = { 'filterType': {'DataType': 'String', 'StringValue': '1'} } response = sns.publish( TopicArn='arn:aws:sns:us-east-1:9999999999:MyTopic', # SNSトピックのARNを指定 Message=json.dumps(message), # メッセージ本文 Subject='Test message from Lambda', # メッセージのタイトル(オプション) MessageAttributes=message_attributes ) return { 'statusCode': 200, 'body': json.dumps('Hello from Lambda!') }
この例では、filterTypeが「1」であるメッセージがSNSに送信され、そのメッセージ属性に基づいてフィルタリングが行われます。
3. メッセージ本文でのフィルタリング
SNSではメッセージ本文の内容に基づいてもフィルタリングが可能です。次の例では、メッセージ本文内のresult.alertTypeが「warn」または「error」の場合にのみメッセージを受信します。
サブスクリプションフィルターポリシー例
{ "result": { "alertType": [ "error", "warn" ] } }
Lambda関数の例
Lambda関数からメッセージを送信する際に、メッセージ本文の内容に基づいたフィルタリングが行われます。
import json import boto3 def lambda_handler(event, context): sns = boto3.client('sns') message = { 'type': '1', 'message': 'Hello from Lambda!', 'key1': 'val1', 'key2': 'val2', 'result': { 'alertType': 'warn' } } message_attributes = { 'filterType': {'DataType': 'String', 'StringValue': '1'} } response = sns.publish( TopicArn='arn:aws:sns:us-east-1:9999999999:MyTopic', # SNSトピックのARNを指定 Message=json.dumps(message), # メッセージ本文 Subject='Test message from Lambda', # メッセージのタイトル(オプション) MessageAttributes=message_attributes ) print('PublishToSns end') return { 'statusCode': 200, 'body': json.dumps('Hello from Lambda!') }
この例では、alertTypeが「warn」であるため、このメッセージはサブスクリプションポリシーで定義されたフィルターを通過します。
4. まとめ
SNSサブスクリプションフィルターは、特定のメッセージ属性や本文の内容に基づいて、メッセージをフィルタリングする強力なツールです。この機能を利用することで、例えば特定の警告やエラーが発生した際にのみアラートを発生させるなど、効率的な通知システムを構築できます。
この仕組みを活用することで、無駄なメッセージの受信を減らし、システムのパフォーマンスや管理の効率を向上させることが可能です。AWSのサーバーレスアーキテクチャの一環として、ぜひSNSサブスクリプションフィルターを使いこなしてみてください!!
この記事をシェアする
合同会社raisexでは一緒に働く仲間を募集中です。
ご興味のある方は以下の採用情報をご確認ください。