应用订阅筛选策略 - Amazon Simple Notification Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

应用订阅筛选策略

您可以使用 Amazon SNS 控制台将筛选策略应用于 Amazon SNS 订阅。或者,要以编程方式应用策略,您可以使用 Amazon SNS API、Amazon Command Line Interface (Amazon CLI) 或任何支持 Amazon SNS 的 Amazon 开发工具包。

重要

Amazon 服务(例如 IAM 和 Amazon SNS)使用称为最终一致性的分布式计算模型。对订阅筛选器策略的添加或更改最多需要 15 分钟即可完全生效。

Amazon Web Services Management Console

  1. 登录 Amazon SNS 控制台

  2. 在导航面板中,选择订阅

  3. 选择订阅,然后选择编辑

  4. Edit EXAMPLE1-23bc-4567-d890-ef12g3hij456 (编辑示例1-23bc-4567-d890-ef12g3hij456) 页上,展开 Subscription filter policy (订阅筛选策略) 部分。

  5. JSON editor (JSON 编辑器) 字段中,提供筛选策略的 JSON 正文。

  6. 选择保存更改

    Amazon SNS 将您的筛选策略应用到订阅。

Amazon CLI

要使用 Amazon Command Line Interface (Amazon 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: . . ." } }

Amazon开发工具包

以下代码示例显示如何设置 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); } }
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 详细信息,请参阅 Amazon SDK for Python (Boto3) API 参考中的 SetSubscriptionAttributes

Amazon SNS API

要使用 Amazon SNS API 应用筛选策略,需要请求 SetSubscriptionAttributes 操作。将 AttributeName 参数设置为 FilterPolicy,并将 AttributeValue 参数设置为您的筛选策略 JSON。

Amazon CloudFormation

要使用 Amazon CloudFormation 应用筛选策略,请使用 JSON 或 YAML 模板创建一个 Amazon CloudFormation 堆栈。有关更多信息,请参阅 Amazon CloudFormation 用户指南中的 AWS::SNS::Subscription 资源的 FilterPolicy 属性以及示例 Amazon CloudFormation 模板

  1. 登录到 Amazon CloudFormation 控制台

  2. 选择 Create Stack

  3. Select Template (选择模板) 页面上,依次选择 Upload a template to Amazon S3 (将模板上传到 Amazon S3)、您的文件和下一步

  4. 指定详细信息页面中,执行以下操作:

    1. 对于堆栈名称,键入 MyFilterPolicyStack

    2. 对于 myHttpEndpoint,键入要订阅主题的 HTTP 终端节点。

      提示

      如果没有 HTTP 终端节点,请创建一个。

  5. Options (选项) 页面上,选择 Next (下一步)

  6. Review 页面上,选择 Create