Тестирование AWS Lambdas локально за конечными точками API Gateway

AWS noob здесь. Это что-то вроде «вопроса о передовой практике», но я постараюсь уточнить:

Я знаю, что могу протестировать лямбда-выражения в узле локально с помощью файла json для ввода, но я не уверен, что лучший способ «интеграционного тестирования» моего веб-приложения, которое будет работать в S3 и вызывать лямбда-выражения в ответ на вызовы конечной точки шлюза API. .

Было бы замечательно использовать мои фактические файлы конфигурации шлюза API, чтобы я мог вызывать те же методы локально и выполнять свои Lambdas локально. В этой статье говорится, что это невозможно, но пока нет тестовой среды локального шлюза API: http://nickmchardy.com/blog/2015/09/my-oughtts-about-aws-api-gateway-working-with-aws-lambda

Возможно, это непонятно, пример: если у меня есть пользователи / метод в API Gateway с GET и POST, которые подключены к listUsers.js и createUser.js Lambdas соответственно в AWS; в разработке я хотел бы позвонить: http://localhost:0000/users GET / POST и запустить Lambdas и дать правильные ответы, поэтому я могу запустить всю свою архитектуру локально.

Очевидно, что вызов объекта по URL-адресу не особенно сложен, поэтому мой вопрос заключается в следующем: как лучше всего это сделать, учитывая, что у меня будет моя конфигурация (Cloudfront !? JAWS !?) для того, как эти вещи связываются вместе в AWS, может Я вообще использую его для локального тестирования?

Приносим извинения, если это непонятно или очень очевидно!


person Ian Grainger    schedule 26.12.2015    source источник


Ответы (7)


Ой. Ответ очевиден: «Serverless» (ранее JAWS): https://github.com/serverless/serverless . Нужно продолжать гуглить, извинения! Не уверен, стоит ли удалять этот вопрос сейчас ?! Думаю, это может быть полезно другим? Тем более что Serverless в новинку?

person Ian Grainger    schedule 26.12.2015
comment
Пожалуйста, не удаляйте это! В противном случае я, возможно, не нашел бы Serverless! :) - person Cam Jackson; 27.12.2015
comment
Бессерверная версия очень не закончена, кстати. Мы отказались от AWS API Gateway. Инструменты разработчика не просты в использовании! (Пока что) - person Ian Grainger; 10.01.2016

В настоящее время у AWS API Gateway и AWS Lambda нет версии для локального тестирования, но мы рассмотрим ее как запрос функции.

person Ka Hou Ieong    schedule 29.12.2015
comment
Пожалуйста, работайте без сервера! - идея кажется блестящей, но еще не очень близка к завершению. - person Ian Grainger; 05.01.2016

Наш пакет (Bespoken Tools) позволит вам сделать именно это. В этом руководстве объясняется, как: http://docs.bespoken.tools/en/latest/tutorials/tutorial_lambda_local/

Краткое резюме:
1) Установите специальные инструменты
npm install bespoken-tools -g
2) Запустите прокси с помощью Lambda
bst proxy lamdba index.js
3) Возьмите URL-адрес, который он распечатывает, и используйте его в API Шлюз
Настройте API-шлюз как HTTP-интеграцию и используйте URL-адрес, который распечатывается при запуске прокси на шаге 2.

Надеюсь, это поможет! После того, как вы его настроите, вызовы вашего API-шлюза будут поступать непосредственно в Lambda, работающую локально на вашем ноутбуке.

person John Kelvie    schedule 03.11.2016

Недавно я использовал ClaudiaJS, чтобы помочь мне в разработке AWS Lambda. Создатель также создал эту библиотеку под названием claudia-api-builder, которая поможет вам во всем создавать AWS. Шлюз API, запускающий лямбда-событие. В рамках этой структуры вы можете протестировать конечную точку в своем тестовом классе или создать что-то вроде

var apiRequest = {
  context: {
    path: '/task',
    method: 'GET'
  },
  queryString: {
    name: 'mike'
  }
};
// This method will simulate your api gateway endpoint
api.router(apiRequest, {done: function(err, data){
  console.log(data);
}});

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

person Martin Valentino    schedule 11.03.2016

Вы также можете использовать aws-sam-local Сначала вам нужно установить докер. Далее выполните следующие действия:

$ npm install -g aws-sam-local
$ cd path/to/your/code
$ sam local start-api

Интерфейс командной строки сопоставит вашу функцию API с URL-адресом localhost. Теперь вы можете использовать cURL, Postman или свой браузер для достижения конечной точки API.

person Neil Girardi    schedule 26.10.2017

К сожалению, невозможно запустить шлюз API локально.

Я не уверен, что есть лучшая практика, но у нас есть несколько копий одного и того же API в шлюзе API: API для разработчиков, промежуточный и живой API. Мы не решили использовать этапы, поскольку конечные точки были бы связаны с одной и той же лямбда-функцией, и управление версиями было действительно затруднительным (сейчас это несколько лучше). Создавая отдельные API и отдельные функции Lambda, довольно легко иметь три готовые настройки. Используя несколько сценариев оболочки, которые мы создали, мы можем развернуть их на любом этапе.

Недостатком является то, что вы можете развиваться, только находясь в сети, но для нас это не недостаток.

person Luc Hendriks    schedule 26.12.2015
comment
Ага, вот что у нас есть. Все онлайн-тестирование, где каждый разработчик имеет свой собственный этап - сценическое имя затем передается лямбда-выражению, поэтому каждый разработчик также может иметь свои собственные таблицы Dynamo DB - но, видимо, ответ - «бессерверный» (это новинка)! Смотрите мой ответ :) - person Ian Grainger; 26.12.2015

Я предлагаю вам сделать следующее: 1. Когда вы пишете лямбда-выражение, убедитесь, что оно не знает, что его вызвало (например, http), а знает все, что ему нужно знать из события json.

2. Если вы выполнили «1», используйте «grunt»: https://www.npmjs.com/package/grunt-aws-lambda для тестирования Lambda с помощью пользовательских файлов «событий». Это позволит вам объединить вашу лямбду отдельно от шлюза aws api.

3. используйте тест npm, чтобы создать тест E2E с HTTP-запросом, чтобы убедиться, что манипуляции с вашим телом выполняются правильно.

person Yoni    schedule 09.01.2016
comment
К сожалению, проблема не в лямбдах, а в API-шлюзе, поэтому я могу запускать приложение без AWS. Я не буду голосовать против, но это не то, что мне было нужно. Serverless был очень близок, но еще не закончен. - person Ian Grainger; 10.01.2016