Я пытаюсь настроить привет мировой пример с лямбдой AWS и служу ей через шлюз API. Я нажал "Create a Lambda Function", которые настраивают API gatway и выбрали опцию Blank Function. Я добавил функцию лямбды, найденную на руководстве по началу работы шлюза AWS:
exports.handler = function(event, context, callback) {
callback(null, {"Hello":"World"}); // SUCCESS with message
};
Проблема - то, что, когда я выполняю ПОЛУЧИТЬ запрос к нему, он возвращает назад 502 ответа { "message": "Internal server error" }
. И журналы говорят, что "Выполнение перестало работать из-за ошибки конфигурации: Уродливый ответ прокси Лямбды".
Я попробовал все вышеупомянутое предложение, но оно не работает, в то время как body
значение не String
return {
statusCode: 200,
headers: {
"Content-Type": "application/json",
"Access-Control-Allow-Origin": "*"
},
body: JSON.stringify({
success: true
}),
isBase64Encoded: false
};
Для Python3:
import json
def lambda_handler(event, context):
return {
'statusCode': 200,
'headers': {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*'
},
'body': json.dumps({
'success': True
}),
"isBase64Encoded": False
}
Примечание эти body
не требуется, чтобы быть установленным, это может просто быть пусто:
'body': ''
Частая причина "Уродливой ошибки" ответа прокси Лямбды headers
, которые не являются {String: String, ...}
пары ключа/значений.
С тех пор set-cookie
заголовки могут и действительно появляться в кратных числах, они представлены в http.request.callback.response как set-cookie
ключ, имеющий Array
из Strings
значение вместо единственный String
. В то время как это работает на разработчиков, AWS Шлюз API не понимает это и бросает "Уродливую ошибку" ответа прокси Лямбды.
Мое решение состоит в том, чтобы сделать что-то вроде этого:
function createHeaders(headers) {
const singleValueHeaders = {}
const multiValueHeaders = {}
Object.entries(headers).forEach(([key, value]) => {
const targetHeaders = Array.isArray(value) ? multiValueHeaders : singleValueHeaders
Object.assign(targetHeaders, { [key]: value })
})
return {
headers: singleValueHeaders,
multiValueHeaders,
}
}
var output = {
...{
"statusCode": response.statusCode,
"body": responseString
},
...createHeaders(response.headers)
}
Примечание, что ...
выше не означает Yada Yada Yada. Это оператор .