AWS лямбда: неправильный ответ лямбда-прокси - PullRequest
0 голосов
/ 19 марта 2020

Это типичная проблема, когда L ambda сидит за шлюзом API . Я погуглил почти все сообщения, но до сих пор не могу понять, почему это не удается.

Я прочитал инструкцию о том, как должен выглядеть ответ https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api -gateway-simple-proxy-for-lambda-output-format
Он ищет

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

Вот журнал моего теста с консоли API-шлюза ( Я дважды проверил, чтобы убедиться, что имена полей точно такие же )

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

Кто-нибудь может помочь?

EDIT

Я удалил "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

Фактический JSON ответ , полученный в java app & lambda , равен

{"statusCode":200,"isBase64Encoded":false}

1 Ответ

0 голосов
/ 09 апреля 2020

После сравнения с Node.js примером кажется, что это связано с обработчиком.

При использовании RequestHandler ответом является String

public class MyLambda implements RequestHandler<Object, String> {
    @Override
    public String handleRequest(Object input, Context context) {

От шлюза API. Ответ отображается следующим образом. Обратите внимание, что весь ответ представляет собой String , а шлюз API жалуется

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

Изменено это значение на RequestStreamHandler , ошибка исчезла

public class APIgatewayTest implements RequestStreamHandler {
    @Override
    public void handleRequest(InputStream input, OutputStream output, Context context) throws IOException {

От шлюза API ответ будет следующим:

Thu Apr 09 09:13:08 UTC 2020 : Endpoint response body before transformations: {"statusCode":200,"body":"\"Hello from Lambda!\""}
Thu Apr 09 09:13:08 UTC 2020 : Method response body after transformations: "Hello from Lambda!"
...