如何在Pinpoint双向SMS的SNS主题中通过解析消息体实现订阅过滤?
解决方案:Pinpoint双向SMS + SNS Topic复用与消息过滤
核心结论
SNS订阅过滤策略无法直接基于消息体内容创建规则,它仅支持通过**消息属性(Message Attributes)**进行过滤。所以你需要先把短信里的to号码、keyword等字段提取出来转为消息属性,再用过滤策略实现订阅者的消息隔离。
具体实现步骤
引入Lambda做消息中转
不要让Pinpoint直接把短信发送到SNS Topic,改为先发送到Lambda函数:- 在Pinpoint的双向SMS配置里,把接收短信的目标设置为Lambda函数
- 在Lambda中解析短信消息体,提取你需要的字段(比如目标号码、关键词)
- 将这些字段设置为SNS消息的属性,再把消息转发到目标SNS Topic
配置SNS订阅过滤策略
当消息带着属性进入SNS Topic后,给每个订阅者设置对应的过滤规则:- 如果订阅者只关注特定号码,过滤策略设为:
{"TargetPhoneNumber": ["+1234567890"]} - 如果按关键词过滤,策略设为:
{"Keyword": ["MYKEYWORD"]}
- 如果订阅者只关注特定号码,过滤策略设为:
Lambda示例代码(Python)
import boto3 import json sns_client = boto3.client('sns') TARGET_SNS_TOPIC_ARN = 'arn:aws:sns:us-east-1:123456789012:your-topic-name' def lambda_handler(event, context): # 解析Pinpoint传来的短信消息 sns_message = event['Records'][0]['Sns']['Message'] sms_payload = json.loads(sns_message) # 提取关键字段(注意字段名需匹配Pinpoint实际返回的结构) target_phone = sms_payload['destinationNumber'] # 接收短信的Pinpoint号码 keyword = sms_payload.get('keyword', '') # 转发到SNS并添加消息属性 sns_client.publish( TopicArn=TARGET_SNS_TOPIC_ARN, Message=sns_message, MessageAttributes={ 'TargetPhoneNumber': { 'DataType': 'String', 'StringValue': target_phone }, 'Keyword': { 'DataType': 'String', 'StringValue': keyword } } ) return {'statusCode': 200, 'body': 'Message forwarded successfully'}
注意事项
- 务必测试Pinpoint发送给Lambda的消息结构,确认
destinationNumber、originationNumber等字段的准确名称 - 给Lambda配置对应权限,确保它能向目标Topic发布消息(可使用精细化权限而非全量权限)
- 消息属性的数据类型要与字段内容匹配,比如电话号码用
String类型,避免过滤失败
内容的提问来源于stack exchange,提问作者JakeHova
相关产品推荐
相关产品推荐

