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

API Gateway返回502 Bad Gateway但CloudWatch可见响应的问题排查

API Gateway与Lambda(LAMBDA_PROXY模式)集成返回502错误的排查与解决

问题现象

采用LAMBDA_PROXY模式集成API Gateway与Lambda时,Lambda能正常调用第三方API并在CloudWatch中输出响应,但API Gateway返回502错误,响应体为:

{"message": "Internal server error"}

CloudWatch日志提示:

Wed Dec 14 15:29:17 UTC 2022 : Execution failed due to configuration error: Malformed Lambda proxy response
Wed Dec 14 15:29:17 UTC 2022 : Method completed with status: 502

原因分析

LAMBDA_PROXY模式对Lambda的返回格式有严格要求,必须返回包含特定字段的JSON对象,而不是直接返回字符串。要求的核心字段包括:

  • statusCode: 合法的HTTP状态码(如200、500)
  • body: 字符串格式的响应体(需用JSON.stringify()序列化)
  • headers: 可选,响应头信息(如Content-Type)

当前代码直接返回了JSON.stringify()后的字符串,不符合Proxy模式的响应结构规范,导致API Gateway无法解析,触发502错误。

解决方案

修改Lambda代码,确保返回符合LAMBDA_PROXY要求的结构,同时优化异步代码写法:

const axios = require('axios');
const url = require("url");

exports.handler = async (event, context) => {
    try {
        // 提取请求参数(建议添加参数存在性校验)
        const maxRJ = event.queryStringParameters?.maxResults;
        const jiraLabelJ = event.queryStringParameters?.labels;
        const statusJ = event.queryStringParameters?.status;
        
        const config = {
            headers: {
                "Accept": "application/json",
                "Accept-Encoding": "gzip,deflate,compress",
                "Authorization": "XXXXXXXX"
            }
        };
        
        const queryParams = {
            jql: `status=${statusJ} AND labels=${jiraLabelJ}`,
            maxResults: maxRJ,
        };

        const params = new url.URLSearchParams(queryParams);
        console.log(params);
        
        // 用await替代then/catch,简化异步逻辑
        const response = await axios.get(`apiURL?${params}`, config);
        
        // 返回符合Proxy模式的标准结构
        return {
            statusCode: 200,
            headers: {
                "Content-Type": "application/json",
                // 若需跨域,可添加以下头
                // "Access-Control-Allow-Origin": "*"
            },
            body: JSON.stringify(response.data)
        };
    } catch (error) {
        console.error(error);
        // 错误场景也返回标准结构,便于排查
        return {
            statusCode: 500,
            headers: {
                "Content-Type": "application/json"
            },
            body: JSON.stringify({ error: error.message })
        };
    }
};

关键修改点说明

  1. 统一响应结构:成功/失败场景都返回包含statusCode、headers、body的对象
  2. 优化异步逻辑:用await替代then/catch,避免Promise嵌套,代码更易维护
  3. 参数安全性:使用可选链?.避免queryStringParameters不存在时触发报错
  4. 明确响应头:添加Content-Type头,确保API Gateway正确解析响应体

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 02:10:32