Неверный ответ Lambda-прокси: развертывание конечных точек Python через бессерверную

Я пытаюсь отправить ответ JSON обратно через функцию Lambda (построение через Serverless), но это дает ошибку.

Создаю ответ:

response = {}
response["file_name"] = file_name
response["status"] = status
response["description"] = message
response["data"] = data 
return {
    "isBase64Encoded": False,
    "statusCode": 200,
    "headers": {
        "Content-Type": "application/json",
    },
    "body": json.dumps(response)
}

Но AWS только возвращается:

{
    "message": "Internal server error"
}

Я распечатываю этот объект ответа, и это:

{'isBase64Encoded': False, 'statusCode': 200, 'headers': {'Access-Control-Allow-Origin': '*', 'Content-Type': 'application/json'}, 'body': '{"file_name": "upload-4660557513950187006.csv", "status": "success", "description": "Success.", "data": ""}'}

Когда я вызываю через API Gateway, я получаю следующие журналы:

Thu Oct 05 16:21:15 UTC 2017 : Endpoint request body after transformations: {"resource":"/parse","path":"/parse","httpMethod":"POST","headers":null,"queryStringParameters":null,"pathParameters":null,"stageVariables":null,"requestContext":{"path":"/parse","accountId":"317910044022","resourceId":"xik9xe","stage":"test-invoke-stage","requestId":"test-invoke-request","identity":{"cognitoIdentityPoolId":null,"accountId":"317910044022","cognitoIdentityId":null,"caller":"AIDAJGNM4CLIWDKHDDV2U","apiKey":"test-invoke-api-key","sourceIp":"test-invoke-source-ip","accessKey":"ASIAJHGYEQDHKLLRWL6A","cognitoAuthenticationType":null,"cognitoAuthenticationProvider":null,"userArn":"arn:aws:iam::317910044022:user/chase","userAgent":"Apache-HttpClient/4.5.x (Java/1.8.0_131)","user":"AIDAJGNM4CLIWDKHDDV2U"},"resourcePath":"/parse","httpMethod":"POST","apiId":"3gvwsa0cj2"},"body":"{\n\t\"file_name\": \"upload-4660557513950187006.csv\",\n\t\"vendor\": \"\"\n}","isBase64Encoded":false}
Thu Oct 05 16:21:15 UTC 2017 : Sending request to https://lambda.us-east-1.amazonaws.com/2015-03-31/functions/arn:aws:lambda:us-east-1:317910044022:function:PyParsingService-dev-parse/invocations
Thu Oct 05 16:21:16 UTC 2017 : Received response. Integration latency: 416 ms
Thu Oct 05 16:21:16 UTC 2017 : Endpoint response body before transformations: "{\"isBase64Encoded\": false, \"statusCode\": 200, \"headers\": {\"Access-Control-Allow-Origin\": \"*\", \"Content-Type\": \"application/json\"}, \"body\": \"{\\\"file_name\\\": \\\"upload-4660557513950187006.csv\\\", \\\"status\\\": \\\"success\\\", \\\"description\\\": \\\"Success.\\\", \\\"data\\\": \\\"\\\"}\"}"
Thu Oct 05 16:21:16 UTC 2017 : Endpoint response headers: {x-amzn-Remapped-Content-Length=0, x-amzn-RequestId=36059915-a9e9-11e7-8444-438990db7407, Connection=keep-alive, Content-Length=317, Date=Thu, 05 Oct 2017 16:21:15 GMT, X-Amzn-Trace-Id=root=1-59d65bfb-7000702549081b6682b894a9;sampled=0, Content-Type=application/json}
Thu Oct 05 16:21:16 UTC 2017 : Execution failed due to configuration error: Malformed Lambda proxy response
Thu Oct 05 16:21:16 UTC 2017 : Method completed with status: 502

Не очень опытен с Python - любая помощь будет принята с благодарностью. Согласно this ответ должен быть правильно отформатирован для API Gateway. Не уверен, почему мой ответ не соответствует тому, что ищет API Gateway.


comment
Возможно, проблема не в JSON. Можете ли вы попробовать вызвать Lambda с пустым ответом? Просто чтобы убедиться, что это из-за проблемы с разрешением   -  person Vijayanath Viswanathan    schedule 05.10.2017
comment
Что вам говорят журналы Cloudwatch? Так выглядит ваш реальный код? Если это так, то ваш код Python получает синтаксическую ошибку из-за неправильного отступа.   -  person Noel Llevares    schedule 05.10.2017
comment
@dashmug Я включил логи в исходный пост. Я получаю сообщение об ошибке ответа неверного лямбда-прокси.   -  person Chase    schedule 05.10.2017
comment
@Chase Используете ли вы тип интеграции Lambda Proxy? Есть ли ошибки в CloudWatch, если вы вызываете его через HTTP-запрос (без использования консоли API Gateway)?   -  person Noel Llevares    schedule 05.10.2017


Ответы (1)


Я понял, что делаю не так. Ошибка Выполнение не удалось из-за ошибки конфигурации: ошибка неверного ответа прокси-сервера Lambda ссылалась на ответ, который Lambda пыталась отправить обратно через шлюз API. Бессерверная версия автоматически использует интеграцию с лямбда-прокси. Когда я смотрел на ответ, я заметил лишнее экранирование на базовом уровне ответа (например, "{\"isBase64Encoded\": false, \"statusCode\": 200, ...}), которое, как мне кажется, вызывало ошибку. Разумеется, когда я копнул глубже, я понял, что сбрасываю JSON (json.dumps()) после создания ответа, который выдавал ошибку.

Спасибо за ответы. Бездумная ошибка с моей стороны.

person Chase    schedule 06.10.2017