Лямбда возвращает только 200 код отклика

Я создал образец лямбда-функции для получения ответов об успехах и ошибках. функция как ниже

exports.handler = (event, context, callback) => {
if(event.val1=="1")
{
 callback(null, 'success');
}else
{
 callback(true, 'fail');
}
};

Когда я протестировал эту функцию с помощью API Gateway, я получил другое тело ответа, но код ответа такой же (всегда возвращать код ответа 200 ok).

Можно ли настроить код состояния из лямбда-функции (например: нужно 500 для ответов об ошибках и 200 для успешных ответов)?


person Abdul Manaf    schedule 21.09.2016    source источник
comment
Полезен ли stackoverflow.com/a/31371862/1428388?   -  person jzonthemtn    schedule 21.09.2016


Ответы (2)


Возможно, вы захотите взглянуть на новый упрощенный Лямбда-прокси.

Используя это, вы можете определять свои коды состояния, заголовки возврата и содержимое тела прямо из вашей Lambda.

Пример из документов:

'use strict';
console.log('Loading hello world function');

exports.handler = function(event, context) {
    var name = "World";
    var responseCode = 200;
    console.log("request: " + JSON.stringify(event));
    if (event.queryStringParameters !== null && event.queryStringParameters !== undefined) {
        if (event.queryStringParameters.name !== undefined && event.queryStringParameters.name !== null && event.queryStringParameters.name !== "") {
            console.log("Received name: " + event.queryStringParameters.name);
            name = event.queryStringParameters.name;
        }

        if (event.queryStringParameters.httpStatus !== undefined && event.queryStringParameters.httpStatus !== null && event.queryStringParameters.httpStatus !== "") {
            console.log("Received http status: " + event.queryStringParameters.httpStatus);
            responseCode = event.queryStringParameters.httpStatus;
        }
    }

    var responseBody = {
        message: "Hello " + name + "!",
        input: event
    };
    var response = {
        statusCode: responseCode,
        headers: {
            "x-custom-header" : "my custom header value"
        },
        body: JSON.stringify(responseBody)
    };
    console.log("response: " + JSON.stringify(response))
    context.succeed(response);
};
person Bob Kinney    schedule 21.09.2016

Чтобы отправить собственный код ошибки из AWS API GW, вы должны использовать шаблон сопоставления ответов в ответе интеграции. По сути, вы определяете регулярное выражение для каждого кода состояния, который хотите вернуть из API GW.

Шаги:

  • Определите ответ метода для каждого кода состояния Документация AWS
  • Определите RegEx ответа интеграции для каждого отображения статуса в ответ правильного метода AWS Документация

При использовании этой конфигурации код возврата HTTP, возвращаемый API GW клиенту, совпадает с регулярным выражением в "selectionPattern".

Наконец, я настоятельно рекомендую использовать платформу API GW для обработки этой конфигурации. Serverless - очень хорошая среда.

Используя Servereless, вы можете определить шаблон следующим образом (бессерверный фрагмент 0.5):

myResponseTemplate:
application/json;charset=UTF-8: |
#set ($errorMessageObj = $util.parseJson($input.path('$.errorMessage'))) {
    "status" : $errorMessageObj.status,
    "error":{
        "error_message":"$errorMessageObj.error.message",
        "details":"$errorMessageObj.error.custom_message"
    }
}
responsesValues:
'202':
  selectionPattern: '.*"status": 202.*'
  statusCode: '202'
  responseParameters: {}
  responseModels: {}
  responseTemplates: '$${myResponseTemplate}'
'400':
  selectionPattern: '.*"status": 400.*'
  statusCode: '400'
  responseParameters: {}
  responseModels: {}
  responseTemplates: '$${myResponseTemplate}'

Затем просто верните объект json из лямбда-выражения, как в следующем фрагменте кода Python (вы можете использовать аналогичный подход в nodejs):

 def handler(event, context):
     # Your function code ...
     response = { 
         'status':400, 
         'error':{
             'error_message' : 'your message',
             'details' : 'your details'
          }
     }
    return response

Надеюсь, это поможет.

G.

person Girolamo Piccinni    schedule 25.09.2016