AWS SQS→EventBridge Pipe→SNS→SQS链路JSON格式丢失问题排查
问题原因及解决方案
核心原因
问题出在EventBridge Pipe的消息转换逻辑上:
- 当Pipe从SQS源读取消息时,默认会传递整个SQS消息的完整结构(包含
MessageId、ReceiptHandle、Body等字段),而非只提取你需要的Body中的报表元数据JSON。 - 若未配置Pipe的输入转换规则,SNS收到的会是包含SQS消息结构的嵌套JSON,而非原始报表元数据。此时即使开启了SQS订阅的Raw delivery,最终收到的消息体是这个嵌套JSON的字符串形式(而非原始JSON对象),导致反序列化失败。
- 直接向SNS发布消息时,你传递的是原始报表元数据JSON,SNS直接将其作为消息体发送,因此订阅队列能收到正确格式的内容。
解决方案
1. 配置EventBridge Pipe的输入转换规则
在Pipe的目标配置中添加Input Transformer,仅提取SQS消息的Body字段传递给SNS:
- 输入路径设置为:
{"body": "$.Body"} - 输入模板设置为:
<body>
这样Pipe会直接将SQS消息体中的原始JSON内容发送给SNS,而非整个SQS消息结构。
2. 验证SNS订阅的Raw Delivery设置
确认Report-Ready-TTL-Monitor SQS订阅Report-Ready SNS主题时:
- 已开启Raw message delivery选项(该选项会跳过SNS默认的消息包装,直接将消息体发送到SQS)
- 订阅协议选择的是
Amazon SQS,无额外格式转换设置
3. 排查Pipe的输出日志
在Pipe的目标配置中开启CloudWatch日志记录,查看Pipe发送到SNS的消息内容:
- 如果日志显示原始报表元数据JSON,说明转换规则生效,问题可能在SNS订阅端
- 如果日志显示包含SQS消息结构的嵌套JSON,说明转换规则未正确配置
4. 确认SQS发送端的消息格式
确保向Report-Built SQS发送消息时,是将报表元数据序列化为标准JSON字符串后发送(这一步你已通过直接发SNS验证,大概率无问题,但可再次确认)
内容的提问来源于stack exchange,提问作者DVS
相关产品推荐
相关产品推荐

