Например, если я хочу вернуть конкретную ошибку 400 для недопустимых параметров или, возможно, 201, когда вызов лямбда-функции привел к созданию.
Я хотел бы иметь разные коды состояния http, но похоже, что шлюз api всегда возвращает код состояния 200, даже если лямбда-функция возвращает ошибку.
amazon-web-services
aws-lambda
aws-api-gateway
ОбезьянаОбезьяна
источник
источник
Ответы:
Обновление за 20-9-2016
Наконец, Amazon упростил эту задачу, используя интеграцию с Lambda Proxy . Это позволяет вашей лямбда-функции возвращать правильные HTTP-коды и заголовки:
Попрощайтесь с сопоставлением запросов и ответов в API Gateway!
Вариант 2
Интегрируйте существующее приложение Express с Lambda / API Gateway с помощью aws-serverless-express .
источник
callback
стиля. Просто сделайcallback(null, {statusCode: 200, body: 'whatever'})
.return { "isBase64Encoded": True, "statusCode": 200, "headers": { }, "body": "" }
Вот самый быстрый способ вернуть пользовательские коды состояния HTTP и пользовательские
errorMessage
:На панели управления API Gateway сделайте следующее:
Добавьте интеграционный ответ для каждого из ранее созданных кодов состояния HTTP. Убедитесь, что включен сквозной вход . Используйте регулярное выражение лямбда-ошибок, чтобы определить, какой код состояния следует использовать, когда вы возвращаете сообщение об ошибке из лямбда-функции. Например:
Маршрут вашего шлюза API должен вернуть следующее:
Я не вижу возможности скопировать эти настройки и повторно использовать их для разных методов, поэтому нам приходится делать много раздражающего избыточного ручного ввода!
Мои ответы интеграции выглядят так:
источник
return context.fail(new Error('bad one'))
Чтобы иметь возможность возвращать настраиваемый объект ошибки в формате JSON, вам нужно выполнить несколько шагов.
Во-первых, вы должны дать сбой Lambda и передать ему строковый объект JSON:
Затем вы настраиваете отображение регулярных выражений для каждого из кодов состояния, которые вы хотите вернуть. Используя объект, который я определил выше, вы должны установить это регулярное выражение для 400:
. * "статус": 400. *
Наконец, вы настраиваете шаблон сопоставления для извлечения ответа JSON из свойства errorMessage, возвращаемого Lambda. Шаблон отображения выглядит так:
$ input.path ('$. errorMessage')
Я написал об этом статью, в которой более подробно рассказывается и объясняется поток ответов от Lambda до API Gateway здесь: http://kennbrodhagen.net/2016/03/09/how-to-return-a-custom-error-object -and-status-code-from-api-gateway-с-лямбда /
источник
1) Настройте ресурс шлюза API для использования интеграции с лямбда-прокси , установив флажок «Использовать интеграцию с лямбда-прокси» на экране «Запрос интеграции» определения ресурса шлюза API. (Или определите его в конфигурации cloudformation / terraform / serverless / etc)
2) Измените свой лямбда-код двумя способами
event
(1-й аргумент функции) соответствующим образом. Это уже не просто полезная нагрузка, она представляет собой весь HTTP-запрос, включая заголовки, строку запроса и тело. Образец ниже. Ключевым моментом является то, что тела JSON будут строками, требующими явногоJSON.parse(event.body)
вызова (не забывайте обtry/catch
этом). Пример ниже.statusCode
,body
иheaders
.body
должен быть строкой, так что делайте поJSON.stringify(payload)
мере необходимостиstatusCode
может быть числомheaders
это объект имен заголовков к значениямПример аргумента лямбда-события для интеграции прокси
Образец формы ответа обратного вызова
Примечания. Я считаю, что
context
такие методыcontext.succeed()
устарели. Они больше не документируются, хотя, похоже, все еще работают. Я думаю, что кодирование API обратного вызова будет правильным в будущем.источник
Я хотел, чтобы ошибка Lambda была правильной ошибкой 500, после долгих исследований я придумал следующее, которое работает:
О LAMBDA
Для хорошего ответа я возвращаюсь, как показано ниже:
В случае плохого ответа, возврат, как показано ниже
На API-шлюзе
Для МЕТОДА ПОЛУЧЕНИЯ скажите GET of / res1 / service1:
Затем,
Теперь, publish / res1 / service1, нажмите опубликованный URL, который связан с вышеуказанной лямбда
Используя расширенный клиент REST (или почтальон) хром-плагин, вы увидите правильные HTTP-коды, такие как ошибка сервера (500) или 400, вместо 200 HTTP-кода ответа для всех запросов, которые были указаны в «httpStatusCode».
На панели управления API в API Gateway мы можем видеть коды статуса http, как показано ниже:
источник
Самый простой способ сделать это - использовать интеграцию LAMBDA_PROXY . Используя этот метод, вам не нужно устанавливать какие-либо специальные преобразования в конвейер API Gateway.
Ваш возвращаемый объект должен быть похож на фрагмент ниже:
module.exports.lambdaHandler = (event, context, done) => { // ... let response = { statusCode: 200, // or any other HTTP code headers: { // optional "any-http-header" : "my custom header value" }, body: JSON.stringify(payload) // data returned by the API Gateway endpoint }; done(null, response); // always return as a success };
У него есть несколько недостатков: необходимость особенно внимательного отношения к обработке ошибок и привязка лямбда-функции к конечной точке шлюза API; Тем не менее, если вы действительно не собирались использовать его где-либо еще, это не такая уж большая проблема.
источник
Для тех, кто пробовал все, задавая этот вопрос, но не смог сделать это (как и я), проверьте комментарий thedevkit к этому сообщению (спас мне день):
https://forums.aws.amazon.com/thread.jspa?threadID=192918
Воспроизведение полностью ниже:
источник
Вот как это рекомендуется в блоге AWS Compute при использовании API Gateway. Проверка, работает ли интеграция с прямым вызовом лямбда.
Для прямых вызовов Lambda это, по-видимому, лучшее решение для синтаксического анализа на стороне клиента.
источник
Я использую бессерверную версию 0.5. Вот как это работает в моем случае
s-function.json:
handler.js:
источник
Если вы не хотите использовать прокси, вы можете использовать этот шаблон:
источник