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

API Gateway集成SQS:测试页正常Postman调用时MessageAttributes缺失

问题:API Gateway测试与实际调用时SQS消息属性差异排查

我想把API Gateway的请求ID放到SQS消息的属性里,方便消费消息的Lambda记录这个ID做链路追踪。用的映射模板如下:

Action=SendMessage&MessageBody=$util.urlEncode($input.body)&MessageAttribute.1.Name=RequestId&MessageAttribute.1.Value.StringValue=$context.requestId&MessageAttribute.1.Value.DataType=String

通过API Gateway的「Test」标签测试时,SQS消息的MessageAttributes里能正常看到请求ID;但用Postman调用实际端点时,请求能正常走完API Gateway > SQS > Lambda的流程,可消息里就是没有MessageAttributes。这俩情况为啥会有差异?


原因分析及解决办法

1. 映射模板的Content-Type不匹配

API Gateway的映射模板是和请求的Content-Type绑定生效的。你在Test标签测试时,默认用的是API Gateway预设的Content-Type(比如application/json),而Postman调用时可能设置了不同的Content-Type(比如application/x-www-form-urlencoded),甚至没指定,导致你写的模板根本没被触发执行。
解决: 去API Gateway的该集成请求「Mapping Templates」配置里,确保你设置的模板对应的Content-Type和Postman请求的一致。如果想适配所有请求类型,可以直接添加*/*的模板,把你的映射逻辑放进去。

2. 请求ID未做URL编码

模板里直接拼接$context.requestId,实际端点调用时,API Gateway可能对参数做了额外的转义处理,导致消息属性的参数格式错误,SQS识别不到。
解决: 给$context.requestId也加上URL编码,改成$util.urlEncode($context.requestId)。修改后的模板:

Action=SendMessage&MessageBody=$util.urlEncode($input.body)&MessageAttribute.1.Name=RequestId&MessageAttribute.1.Value.StringValue=$util.urlEncode($context.requestId)&MessageAttribute.1.Value.DataType=String

3. 集成请求模式不对

如果你的API Gateway集成请求设置的是「HTTP Proxy」模式,API Gateway会直接转发原始请求,忽略你自定义的映射模板,自然不会添加消息属性。
解决: 确认集成请求类型是「AWS Service」而非「HTTP Proxy」,并且在「Integration Request」里开启了映射模板的配置,确保模板能被正确执行。


内容的提问来源于stack exchange,提问作者gweilo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 15:05:05