【问题标题】:aws apigateway lambda always return 502aws apigateway lambda 总是返回 502
【发布时间】:2021-04-19 18:21:49
【问题描述】:

我为我的代理服务器创建了 aws apigateway lambda 集成。当我向网关发出获取请求时,请求成功通过。 lambda 函数也执行成功,并在 outputstream 中写入响应,statusCode 为 200。但 apigateway 始终返回 502。

handleRequest() 的片段:

 BufferedReader reader = new BufferedReader(new 
        InputStreamReader(inputStream));
        JSONObject event = (JSONObject) parser.parse(reader);
        request = Input.builder().setEvent(event).build();

    Response response = requestManager.handleRequest(request);
    logger.log(String.format("Response [%s]", response.toString()));

    JSONObject responseJson = new JSONObject();
    responseJson.put("statusCode", response.getStatusCode());
    responseJson.put("headers", response.getHeaders());
    JSONObject jsonBody = (JSONObject) parser.parse(response.getBody());
    responseJson.put("body", jsonBody);
    OutputStreamWriter writer = new OutputStreamWriter(outputStream, "UTF-8");
    logger.log("response recieved");
    logger.log(String.format("responseJson [%s]", responseJson));
    writer.write(responseJson.toJSONString());
    writer.close();
    logger.log(String.format("output stream [%s]", outputStream));

我错过了什么吗?

【问题讨论】:

    标签: amazon-web-services aws-lambda aws-api-gateway


    【解决方案1】:

    Lambda 的 502 错误通常表明您正在使用 Lambda 代理方法并且未生成正确的 JSON 响应。确保您的回复符合appropriate format

    如果您仍有问题,请分享您的 Lambda 函数生成的示例 JSON。

    【讨论】:

    • 输出流 [ { "headers": { "Keep-Alive": "", "Transfer-Encoding": "chunked", "Server": "Apache", "Vary": "Accept -Encoding", "Date": "", "Content-Type": "application/json;charset=UTF-8" }, "body": { "metadata": {}, "http_code": 200, "data “:{“大小”:1,“list_item_type”:“消息”,“类型”:“消息”,“项目”:[]},“消息”:“”,“状态”:“成功”},“状态码": 200 } ]
    • @kunalshrivastava 正文应为字符串。如果要传回 JSON,则需要对其进行转义。
    【解决方案2】:

    我遇到了同样的问题,我的所有日​​志都说 lambda 已成功执行,但 API Gateway 在每个请求上仍然返回 502。结果我忘记在 API Gateway 控制台中配置响应状态代码,所以它抛出错误,因为即使格式正确,响应也是“不正确的”。只需在网关上的路由中添加状态代码 200、400、403 等,这可能会解决您的问题。

    【讨论】:

      【解决方案3】:

      在调用context.succeed(event) 或其他调用context 之前,请确保你的响应是打到你的callback

      这是我的问题,将我的callback 首先修复了持久的502 res。

      【讨论】:

        【解决方案4】:

        响应格式有两种版本。可能是向期望版本 2 的端点发布版本 1 格式的响应:

        格式 1.0 的 Lambda 函数响应

        对于 1.0 格式版本,Lambda 集成必须返回以下格式的响应。

        {
            "isBase64Encoded": true|false,
            "statusCode": httpStatusCode,
            "headers": { "headername": "headervalue", ... },
            "multiValueHeaders": { "headername": ["headervalue", "headervalue2", ...], ... },
            "body": "..."
        }
        

        2.0 格式的 Lambda 函数响应

        使用 2.0 格式版本,API Gateway 可以为您推断响应格式。如果您的 Lambda 函数返回有效的 JSON 并且不返回 statusCode,API Gateway 会做出以下假设:

        • isBase64Encoded 为假。
        • statusCode 为 200。
        • content-type 是 application/json。
        • body 是函数的响应。

        以下示例显示了 Lambda 函数的输出和 API Gateway 的解释。

        Lambda function output API Gateway interpretation
        "Hello from Lambda!" {<br> "isBase64Encoded": false,<br> "statusCode": 200,<br> "body": "Hello from Lambda!",<br> "headers": {<br> "content-type": "application/json"<br> }<br>}
        { "message": "Hello from Lambda!" } {<br> "isBase64Encoded": false,<br> "statusCode": 200,<br> "body": "{ \"message\": \"Hello from Lambda!\" }",<br> "headers": {<br> "content-type": "application/json"<br> }<br>}

        要自定义响应,您的 Lambda 函数应返回具有以下格式的响应:

        {
            "cookies" : ["cookie1", "cookie2"],
            "isBase64Encoded": true|false,
            "statusCode": httpStatusCode,
            "headers": { "headername": "headervalue", ... },
            "body": "Hello from Lambda!"
        } 
        

        【讨论】:

          猜你喜欢
          • 2020-11-02
          • 2017-07-07
          • 2019-08-24
          • 2019-09-15
          • 2023-03-19
          • 2018-11-28
          • 2018-09-30
          • 1970-01-01
          • 2018-09-23
          相关资源
          最近更新 更多