Как быстро создать бессерверный RESTful API с помощью Node.js и AWS

1656651857 kak bystro sozdat besservernyj restful api s pomoshhyu nodejs i

от Марка Хопсона

jG67Tgie-dTmZOfDEzXIFnDgqLbmcpWkETKg

В этом руководстве для начинающих мы кратко опишем «бессерверную» архитектуру программного обеспечения, а затем через несколько минут создадим RESTful API с помощью AWS, Node.js и Swagger.

Итак, что такое Serverless?

Термин «без сервера» (он же «функция как услуга») описывает тип архитектуры, позволяющий развертывать код и работать в эфемерных контейнерах без сохранения состояния от сторонних поставщиков (например, Azure или AWS).

Преимущества без сервера

  • Снижен оперативный менеджмент. Бессерверные архитектуры позволяют разработчикам сосредоточиться на написании кода, а не беспокоиться о настройке и управлении инфраструктурой, на которой работает их код.
  • Легкое, гибкое зум. Поскольку бессерверные функции (ваши бессерверные приложения) не имеют состояния и всегда вызываются событием (например, HTTP-запросом), вы можете запускать столько или меньше функций, сколько вам нужно. Больше вызовов означает больше контейнеров. В зависимости от масштаба и формы вашего трафика это может быть очень экономически эффективным, поскольку бессерверные функции обычно выставляются за вызов.

Бессерверные недостатки

  • Задержка для исходных запросов (известная как «холодный запуск»). Если функция без сервера неактивна (не запускалось некоторое время), обработка первого вызова может потребовать дополнительного времени, поскольку контейнеру придется инициализировать (т.е. выделить хост, загрузить код и т.п.).
  • Отсутствие системного контроля. Поскольку ваш код работает в среде, управляемой поставщиком, вы не сможете контролировать обновление системы или зависимости за пределами вашей базы кода.

Что такое CloudFormation?

CloudFormation – это сервис от Amazon, позволяющий создавать ресурсы AWS с помощью шаблонов. Шаблон – это файл конфигурации (YML или JSON) для предоставления всех ваших ресурсов AWS, таких как экземпляры EC2, таблицы DynamoDB, роли и разрешения IAM или что-либо другое.

Начинаем кодировать!

В этом руководстве мы собираемся создать простой RESTful API с двумя конечными точками:

POST /users/${userId}/hello

Тело запроса будет сохранено в таблице DynamoDB. В данном руководстве тело запроса должно иметь следующую структуру: { "email": "any@email.com" }

ПОЛУЧИТЕ /users/${userId}/hello

Ответ будет содержать значение для "email" установить в запросе POST.

P04BLr7QnCkdrzhpX6KANzaOxxwfzzUTzUGx
Упрощенная архитектура системы для того, что мы собираемся сделать.

Шаг 1: Клонируйте репо

Для этого учебника вам понадобятся два файла: index.js (код NodeJS для нашей функции Lambda) и stack.yml (шаблон стека CloudFormation). Чтобы получить эти файлы, перейдите по этой ссылке Github.

Шаг 2. Просмотрите файл stack.yml

Обратите внимание на stack.yml в хранилище, поскольку это конфигурационный файл, который будет использоваться CloudFormation для создания всего, что потребуется нашей программе.

Ниже приведена подробная схема всех наших ресурсов AWS stack.yml нужно будет создать. Имена, используемые в YML, находятся в красных квадратах.

B5oGAguxI6ZzZESx99yV0XWDk4nrQ1fnd1Pj
Все ресурсы AWS (серые поля), которые будут предоставлены нашим файлом `stack.yml` CloudFormation.

Шаг 3: Загрузите шаблон CloudFormation

Просмотрев YML, перейдите по этой ссылке и нажмите Создать стек кнопку. Выберите Загрузите шаблон на Amazon S3 и загрузите stack.yml файл.

vrSzSMhfzIEL6jbjhsoRqSlGLTTkZrqYNmAI
Создайте свой стек CloudFormation, сначала загрузив наш шаблон `stack.yml`.

На следующем экране вас попросят выбрать Название стека (может быть что угодно). Затем нажмите Далее и выберите Я признаю, что AWS CloudFormation может создавать ресурсы IAMи снова нажмите кнопку Далее.

На этом этапе создается ваш стек. Подождите минуту на странице «Стеки», пока статус вашего стека не станет CREATE_COMPLETE.

C0drkb4xxGIHAJOwSzjYriMn4vDqn9-2xRCP
Страница списка CloudFormation Stacks со статусом.

Шаг 4. Найдите свой Lambda, созданный CloudFormation

Когда ваш стек будет заполнен, перейдите и найдите здесь новую Lambda вашего стека. Название вашей функции Lambda должно походить на ${StackName}-HelloLambda-XXXX.

mjmf5CxbNznAvYisJXr2C7OAPevVVtyBMAYi
Страница списка Lambda

Шаг 5. Разверните (скопируйте и вставьте) свой код на Lambda

Найдите лямбду, щелкните ее, чтобы получить более подробную информацию. Затем перейдите к Код функции раздел, изменить Тип ввода кода к Встроенное редактирование кодазатем откройте и скопируйте index.js (с репо) в редактор кода. Нажмите сохранить.

Rm2WnYjfErwGdcI078HzvlMh8OSbFjwkuXJw
Моя страница деталей Lambda со встроенным редактором кода

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

Шаг 6. Найдите свой шлюз API, созданный CloudFormation

Найдите здесь свой шлюз API, созданный с помощью шаблона CloudFormation. Название вашего шлюза API должно походить на ${StackName}-MyApiGateway.

yfx9e9OPI6QdU577QQLufZ5TkBKHORDyTQik
Страница деталей для конечной точки POST /hello

Шаг 7. Убедитесь, что ваш API Gateway подключен к Lambda

Когда вы найдете свой шлюз API, мы можем проверить, все ли подключено, выбрав ПОСТ вариант под /пользователей а затем щелкните ТЕСТ.

uzYspS9a9seVUYWaxzT8avKmIVKFxPhfTXNx
Тестовая страница конечной точки /hello POST после успешного тестового запроса.

На странице Test установите идентификатор пользователя до 123 и установите Тело запроса к следующему и нажмите Тест. Если все работало, то Статус должно быть 200 без данных.

N8VquMDYIYnp792ZjcuXeM4BBhtQ6zJw5shU
Тестовая страница для конечной точки /hello GET после успешного тестового запроса.

После тестирования конечной точки POST вы можете проверить, сохранены ли ваши данные, перейдя на страницу /hello GET Test и попробовав запрос (не забудьте установить идентификатор пользователя к 123). Тело ответа должно содержать тело запроса из теста POST (см. выше).

Теперь, когда вы убедились, что ваш шлюз API, Lambda и DynamoDB подключен, вы можете развернуть свой шлюз API, чтобы получить доступ к нему из Интернета.

Шаг 8. Разверните шлюз API

Чтобы развернуть API, нажмите меню «Действия» и выберите «Развернуть API». Когда появится всплывающее окно подтверждения, установите Стадия развертывания к прод а затем нажмите Развернуть.

61EyYYsUGVS1d8FBv2hwQFDCm2lksXbIUOnT
Параметр «Развернуть API» в раскрывающемся меню «Действия».

После того, как вы развернете свой API, вас будет перенаправлено в Этапы страница для прод. Здесь вы найдете домен для своего шлюза API в выделенной синей области рядом Вызвать URL.

quo2GSkRBopc1s-bWDVZVgP1PWPu7iod1d8y
Найдите общедоступный URL-адрес (URL-адрес вызова) для своего шлюза API в большом синем поле.

Используя URL со снимка экрана выше, я могу отправить a ПОЛУЧИТЕ /users/123/hello запрос в браузере, как показано ниже.

1Z-JHxCJCE7QtuPvGVvYUtfO83EvqOMg9qap
Успешный запрос к моему бессерверному API из внешнего мира

И все это! Теперь у вас есть бессерверный RESTful API, который является масштабируемым, надежным, не требует исправления или инициализации и не стоит денег во время простоя. Надеюсь, вам понравился этот учебник. Если у вас есть отзывы, оставьте их в комментариях ниже. Спасибо!

Другие примечания и сноски

  • Конфигурация маршрута для шлюза API встроена в конфигурацию шлюза API (MyApiGateway) внутри stack.ymlчто делает YML еще большим уродом, чем она есть.
  • Сменные среды на странице конфигурации HelloLambda Lambda содержат информацию, необходимую для подключения к таблице HelloTable DynamoDB.
  • AWS-SDK поставляется в комплекте с каждой функцией Lambda, поэтому мы можем ее использовать require('aws-sdk') без a package.json. Очень удобно!
  • Вместо того чтобы копировать и вставлять код NodeJS во встроенный редактор на странице Lambda Details, вы можете развернуть свой код через AWS CLI. Мы копируем и вставляем для упрощения.
  • Соблюдайте осторожность, шаблон стека CloudFormation чрезвычайно многословен по своей природе. Я обещаю, что это не только я и мояstack.yml.
  • Основным ключом раздела таблицы HelloTable DynamoDB является идентификатор пользователя
  • от тебя/SalamiJack: «Стоит отметить, что производительность API Gateway+Lambda, даже для разогретого простого Lambda, довольно плоха. Ожидайте, что время ответа будет 80-150 мс».

Впервые опубликовано medium.com 26 марта 2018 года.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *