aws apigateway lambda总是返回502

时间:2017-03-27 19:26:23

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

我为我的代理服务器创建了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));

我错过了什么吗?

4 个答案:

答案 0 :(得分:3)

使用Lambda的502错误通常表明您使用的是Lambda代理方法,而不是生成正确的JSON响应。确保您的回复符合appropriate format

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

答案 1 :(得分:0)

我遇到了同样的问题,我的所有日​​志都说lambda已成功执行,但API Gateway仍在每次请求时返回502s。事实证明我忘了在API网关控制台中配置响应状态代码,因此它会抛出错误,因为响应是“错误的”#34;即使格式正确。只需将状态代码200,400,403等添加到网关上的路线即可解决您的问题。

答案 2 :(得分:0)

在致电callback或打电话给context.succeed(event)之前,请确保您的context收到回复。

这是我的问题,我的callback首先修复了持久性502资源。

答案 3 :(得分:0)

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

格式 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。
  • 内容类型是 application/json。
  • body 是函数的响应。

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

<头>
Lambda 函数输出 API 网关解释
"Hello from Lambda!" {
"isBase64Encoded": false,
"statusCode": 200,
"body": "Hello from Lambda!",
"headers": {
"content-type": "application/json"
}
}
{ "message": "Hello from Lambda!" } {
"isBase64Encoded": false,
"statusCode": 200,
"body": "{ \"message\": \"Hello from Lambda!\" }",
"headers": {
"content-type": "application/json"
}
}

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

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