我为我的代理服务器创建了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));
我错过了什么吗?
答案 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 集成必须以以下格式返回响应。
{
"isBase64Encoded": true|false,
"statusCode": httpStatusCode,
"headers": { "headername": "headervalue", ... },
"multiValueHeaders": { "headername": ["headervalue", "headervalue2", ...], ... },
"body": "..."
}
使用 2.0 格式版本,API Gateway 可以为您推断响应格式。如果您的 Lambda 函数返回有效的 JSON 并且不返回 statusCode,API Gateway 会做出以下假设:
以下示例显示了 Lambda 函数的输出和 API Gateway 的解释。
Lambda 函数输出 | API 网关解释 |
---|---|
"Hello from Lambda!" |
{ |
{ "message": "Hello from Lambda!" } |
{ |
要自定义响应,您的 Lambda 函数应返回具有以下格式的响应:
{
"cookies" : ["cookie1", "cookie2"],
"isBase64Encoded": true|false,
"statusCode": httpStatusCode,
"headers": { "headername": "headervalue", ... },
"body": "Hello from Lambda!"
}