AWS SNS问题咨询:HTTP订阅仅接收默认消息而非指定协议消息
为什么SNS只发送默认消息?
这个问题我之前排查过,核心原因是你的消息结构不符合AWS SNS对MessageStructure="json"的格式要求。
SNS要求,当使用JSON格式发送多协议消息时,每个协议(比如http)对应的消息值必须是字符串类型——哪怕你要发的是JSON内容,也得先把它转成字符串再放进去。你现在直接把http字段设成了嵌套的JSON对象,SNS识别不了这种格式,就自动 fallback 到default消息了。
修正后的代码示例
调整一下消息的构造方式,先把HTTP要发送的JSON内容序列化为字符串,再放入顶层消息对象:
import json import boto3 sns_client = boto3.client('sns') # 先定义HTTP消息的内容结构 http_payload = { "data": [ { "type": "articles", "id": "1", "attributes": { "title": "JSON:API paints my bikeshed!", "body": "The shortest article. Ever.", "created": "2015-05-22T14:56:29.000Z", "updated": "2015-05-22T14:56:28.000Z" } } ] } # 构造符合SNS规则的消息:http字段是字符串类型 message = { "default": "Sample fallback message", "http": json.dumps(http_payload) # 把HTTP内容转成字符串 } # 最后整体序列化为JSON字符串发送 message_as_json = json.dumps(message) response = sns_client.publish( TopicArn="arn:aws:sns:us-east-1:MY-ARN", Message=message_as_json, MessageStructure="json" ) print(response)
额外检查项
如果改完还是不行,可以再确认两个点:
- 你的SNS订阅协议是不是选了
HTTP/HTTPS,别选错成其他协议了 - ngrok的公网地址有没有正确配置到订阅里,而且你的Flask应用能正常接收SNS的POST请求
内容的提问来源于stack exchange,提问作者ananthu
相关产品推荐
相关产品推荐

