如何在boto3创建SNS订阅时直接设置Subscription Filter Policy
问题描述
我开发了一个Python API,用于让用户订阅SNS主题以接收Spotify账户相关邮件,所有邮件都发布至单个主题。我了解在AWS控制台创建订阅时可以直接设置订阅过滤策略,但使用boto3设置过滤策略需要订阅ARN,而ARN需等待邮箱确认后才能获取。请问如何像控制台那样,在boto3创建订阅时直接设置过滤策略?
补充代码示例
创建订阅的代码:
>>> import boto3 >>> sns = boto3.client('sns') >>> sns.subscribe(TopicArn='{the_arn}', Protocol='EMAIL', Endpoint='{an_email}') {'SubscriptionArn': 'pending confirmation', ...}
boto3文档中设置过滤策略的示例(需要已确认的订阅ARN):
import boto3 sns = boto3.resource('sns') subscription = sns.Subscription('arn') response = subscription.set_attributes( AttributeName='FilterPolicy', AttributeValue='{"key": "value"}' # 需传入JSON格式字符串 )
解决方案
boto3的subscribe方法支持通过Attributes参数直接在创建订阅时指定过滤策略,无需等待邮箱确认。只需在调用subscribe时,将FilterPolicy作为属性传入,值为JSON格式的字符串(注意不能直接传Python字典)。
示例代码如下:
import boto3 import json sns_client = boto3.client('sns') # 定义过滤策略字典 filter_policy = { "spotify_event_type": ["account_update", "playlist_change"] } # 转换为符合要求的JSON字符串 filter_policy_json = json.dumps(filter_policy) # 创建订阅并同步设置过滤策略 response = sns_client.subscribe( TopicArn='{你的SNS主题ARN}', Protocol='EMAIL', Endpoint='{目标邮箱地址}', Attributes={ 'FilterPolicy': filter_policy_json } ) print(response)
注意事项
- 过滤策略必须以JSON字符串形式传入,使用
json.dumps()将Python字典转换为该格式即可,直接传字典会导致参数错误。 - 即使订阅处于
pending confirmation状态,过滤策略已被成功配置,用户确认邮箱后策略会立即生效。 - 这种方式和AWS控制台创建订阅时设置过滤策略的逻辑完全一致,无需额外调用
set_attributes接口。
内容的提问来源于stack exchange,提问作者Mohamed Yasser
相关产品推荐
相关产品推荐

