You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.01 00:53:16