サブスクリプションフィルターポリシーを適用する - Amazon Simple Notification Service

サブスクリプションフィルターポリシーを適用する

Amazon SNS コンソールを使用して、Amazon SNS サブスクリプションにフィルターポリシーを適用できます。または、プログラムでポリシーを適用するには、Amazon SNS API、AWS Command Line Interface (AWS CLI)、または Amazon SNS 対応の AWS SDK を使用できます。

重要

IAM や Amazon SNS などの AWS サービスでは、結果整合性と呼ばれる分散コンピューティングモデルを使用します。サブスクリプションフィルターポリシーへの追加または変更は、完全に有効になるまでに最大 15 分かかります。

AWS Management Console

  1. Amazon SNS コンソールにサインインします。

  2. ナビゲーションパネルで、[サブスクリプション] を選択します。

  3. サブスクリプションを選択したら、[編集] を選択します。

  4. [Edit EXAMPLE1-23bc-4567-d890-ef12g3hij456] ページで、[サブスクリプションフィルターポリシー] セクションを展開します。

  5. [JSON エディタ] フィールドで、フィルターポリシーの JSON 本文を提供します。

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

    Amazon SNS により、フィルターポリシーがサブスクリプションに適用されます。

AWS CLI

AWS Command Line Interface (AWS CLI) を使用してフィルターポリシーを適用するには、以下の例に示すように set-subscription-attributes コマンドを使用します。

$ aws sns set-subscription-attributes --subscription-arn arn:aws:sns: ... --attribute-name FilterPolicy --attribute-value "{\"store\":[\"example_corp\"],\"event\":[\"order_placed\"]}"

--attribute-name オプションで、FilterPolicy を指定します。--attribute-value で、JSON ポリシーを指定します。

ポリシーに有効な JSON を提供するには、属性名と値を二重引用符で囲みます。また、ポリシーの引数全体を引用符で囲む必要があります。引用符のエスケープを避けるため、例に示すように、一重引用符を使用してポリシーを囲み、二重引用符を使用して JSON 名と値を囲みます。

フィルターポリシーが適用されたことを確認するには、get-subscription-attributes コマンドを使用します。ターミナル出力の属性には、以下の例に示すように、FilterPolicy キーのフィルターポリシーが表示されます。

$ aws sns get-subscription-attributes --subscription-arn arn:aws:sns: ... { "Attributes": { "Endpoint": "endpoint . . .", "Protocol": "https", "RawMessageDelivery": "false", "EffectiveDeliveryPolicy": "delivery policy . . .", "ConfirmationWasAuthenticated": "true", "FilterPolicy": "{\"store\": [\"example_corp\"], \"event\": [\"order_placed\"]}", "Owner": "111122223333", "SubscriptionArn": "arn:aws:sns: . . .", "TopicArn": "arn:aws:sns: . . ." } }

AWS SDK

以下のコード例は、Amazon SNS フィルターポリシーを設定する方法を示しています。

Java
SDK for Java 2.x

public static void usePolicy(SnsClient snsClient, String subscriptionArn) { try { SNSMessageFilterPolicy fp = new SNSMessageFilterPolicy(); // Add a filter policy attribute with a single value fp.addAttribute("store", "example_corp"); fp.addAttribute("event", "order_placed"); // Add a prefix attribute fp.addAttributePrefix("customer_interests", "bas"); // Add an anything-but attribute fp.addAttributeAnythingBut("customer_interests", "baseball"); // Add a filter policy attribute with a list of values ArrayList<String> attributeValues = new ArrayList<>(); attributeValues.add("rugby"); attributeValues.add("soccer"); attributeValues.add("hockey"); fp.addAttribute("customer_interests", attributeValues); // Add a numeric attribute fp.addAttribute("price_usd", "=", 0); // Add a numeric attribute with a range fp.addAttributeRange("price_usd", ">", 0, "<=", 100); // Apply the filter policy attributes to an Amazon SNS subscription fp.apply(snsClient, subscriptionArn); } catch (SnsException e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } }
  • 手順とその他のコードについては GitHub でご確認いただけます。

  • API の詳細については、AWS SDK for Java 2.x API リファレンスの「SetSubscriptionAttributes」を参照してください。

Python
SDK for Python (Boto3)

class SnsWrapper: """Encapsulates Amazon SNS topic and subscription functions.""" def __init__(self, sns_resource): """ :param sns_resource: A Boto3 Amazon SNS resource. """ self.sns_resource = sns_resource def add_subscription_filter(subscription, attributes): """ Adds a filter policy to a subscription. A filter policy is a key and a list of values that are allowed. When a message is published, it must have an attribute that passes the filter or it will not be sent to the subscription. :param subscription: The subscription the filter policy is attached to. :param attributes: A dictionary of key-value pairs that define the filter. """ try: att_policy = {key: [value] for key, value in attributes.items()} subscription.set_attributes( AttributeName='FilterPolicy', AttributeValue=json.dumps(att_policy)) logger.info("Added filter to subscription %s.", subscription.arn) except ClientError: logger.exception( "Couldn't add filter to subscription %s.", subscription.arn) raise
  • 手順とその他のコードについては GitHub でご確認いただけます。

  • API の詳細については、AWS SDK for Python (Boto3) API リファレンスの「SetSubscriptionAttributes」を参照してください。

Amazon SNS API

Amazon SNS API を使用してフィルターポリシーを適用するには、SetSubscriptionAttributes アクションへのリクエストを作成します。AttributeName パラメータを FilterPolicy に設定し、AttributeValue パラメータをフィルターポリシーの JSON に設定します。

AWS CloudFormation

AWS CloudFormation を使用してフィルターポリシーを適用するには、JSON または YAML テンプレートを使用して AWS CloudFormation スタックを作成します。詳細については、『AWS CloudFormation ユーザーガイド』のAWS::SNS::Subscription リソースの「FilterPolicy プロパティ]と「サンプル AWS CloudFormation テンプレート」を参照してください。

  1. AWS CloudFormation コンソールにサインインします。

  2. [スタックの作成] を選択します。

  3. [テンプレートの選択] ページで、[テンプレートを Amazon S3 にアップロード] を選択してから、ファイルを選択して [次へ] をクリックします。

  4. [詳細の指定] ページで、以下の作業を行います。

    1. [スタックの名前] に「MyFilterPolicyStack」と入力します。

    2. [myHttpEndpoint] に、トピックにサブスクライブする HTTP エンドポイントを入力します。

      ヒント

      HTTP エンドポイントがない場合は作成します。

  5. [オプション] ページで、[次へ] をクリックします。

  6. [Review] ページで、[作成] を選択します。