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では一緒に働く仲間を募集中です。

ご興味のある方は以下の採用情報をご確認ください。