You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

AWS Lambda代理响应格式异常求助:API Gateway返回502错误

求助:Lambda代理集成返回格式正确但仍报Malformed Lambda proxy response错误

我最近在把Lambda部署到API Gateway后端时遇到了一个头疼的问题——明明按照官方要求返回了正确的代理响应格式,却一直收到Malformed Lambda proxy response的配置错误,最终返回502状态码。

我反复核对了官方要求的响应格式:

{
  "isBase64Encoded": true|false,
  "statusCode": httpStatusCode,
  "headers": { "headerName": "headerValue", ... },
  "multiValueHeaders": { "headerName": ["headerValue", "headerValue2", ...], ... },
  "body": "..."
}

第一次测试的日志如下:

Thu Mar 19 10:07:58 UTC 2020 : Endpoint response body before transformations: "{"statusCode":200,"body":"RESULTS","isBase64Encoded":false}"
Thu Mar 19 10:07:58 UTC 2020 : Execution failed due to configuration error: Malformed Lambda proxy response
Thu Mar 19 10:07:58 UTC 2020 : Method completed with status: 502

我以为是body字段的问题,于是移除了这个字段,但错误依旧。第二次测试的日志:

Thu Mar 19 23:29:54 UTC 2020 : Received response. Status: 200, Integration latency: 24 ms
Thu Mar 19 23:29:54 UTC 2020 : Endpoint response headers: {Date=Thu, 19 Mar 2020 23:29:54 GMT, Content-Type=application/json, Content-Length=48, Connection=keep-alive, x-amzn-RequestId=f2c2c752-a5e0-45e4-9ff0-d91826b51c7b, x-amzn-Remapped-Content-Length=0, X-Amz-Executed-Version=$LATEST, X-Amzn-Trace-Id=root=1-5e740072-46cee9045a56e04b8023816d;sampled=0}
Thu Mar 19 23:29:54 UTC 2020 : Endpoint response body before transformations: "{"statusCode":200,"isBase64Encoded":false}"
Thu Mar 19 23:29:54 UTC 2020 : Execution failed due to configuration error: Malformed Lambda proxy response
Thu Mar 19 23:29:54 UTC 2020 : Method completed with status: 502

Lambda里实际生成的响应是{"statusCode":200,"isBase64Encoded":false},完全符合要求,实在找不到问题所在,有没有大佬能帮忙排查下?


我的排查建议

兄弟,我之前也踩过几乎一模一样的坑,给你几个实际排查过有效的方向:

  • 揪出JSON的“隐形问题”:日志里的响应看起来没问题,但Java序列化JSON时偶尔会有暗坑——比如不小心带了不可见控制字符,或者序列化后的JSON其实有语法错误(比如引号不配对)。你可以把Lambda里生成的原始JSON字符串复制出来,用JSON校验工具扫一遍,确保完全符合规范。

  • 确认API Gateway的集成模式没选错:一定要确认你开的是Lambda代理集成,不是普通的Lambda集成!如果是普通集成,哪怕你返回标准代理格式也会报错。去API Gateway的方法集成页面看看,“集成类型”是不是明确选了Lambda代理。

  • 试试给响应加个空的headers字段:官方文档说headers是可选的,但我好几次碰到缺少这个字段时,API Gateway识别异常的情况。你可以改成返回这个格式试试:

    {"statusCode":200,"isBase64Encoded":false,"headers":{}}
    
  • 排查Java序列化的细节:既然是Java写的Lambda,得盯紧序列化库的行为——比如你用Jackson的话,有没有把statusCode序列化成数字(不是字符串)?布尔值isBase64Encoded是不是小写的true/false(不是字符串"false")?可以在Lambda里加个日志,直接打印序列化后的原始字符串,别靠API Gateway的日志转译,自己核对最准确。

  • 顺便检查下Lambda权限:虽然报错是格式问题,但有时候权限不足也会触发奇怪的异常。比如Lambda的执行角色有没有给API Gateway调用它的权限?或者Lambda有没有访问自身依赖资源的权限?去IAM控制台瞅一眼角色的权限策略,确保没遗漏。

另外,你可以先在Lambda控制台直接测试函数,看返回的响应是不是完全符合要求。如果Lambda本地测试没问题,那大概率是API Gateway的配置或者集成环节出了问题。


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

火山引擎 最新活动