Сделайте свой Node.js Express API бессерверным и разверните его в AWS

Бессерверная архитектура - альтернатива серверам, требующим больших затрат на обслуживание и расходующих ресурсы. При бессерверном развертывании вам нужно платить только за то, что вы используете. И они освобождают вас от необходимости обрабатывать несколько настроек серверов и их конфигураций.

Поэтому неудивительно, что сегодня разработчики стремятся отказаться от использования серверов со своими приложениями. С помощью AWS Lambda и фреймворка Serverless вы можете быстро развертывать масштабируемые приложения.

В этом руководстве мы рассмотрим развертывание простого бессерверного API с помощью Node.js, AWS Lambda и бессерверной инфраструктуры.

Немного об этих технологиях

AWS Lambda - это облачный бессерверный сервис. Лямбда-функции - это функции без сохранения состояния, которые запускаются событиями и истекают в конце их выполнения.

Учитывая сложный характер AWS Lambda, мы используем бессерверную структуру, чтобы упростить процесс развертывания. Фактически, с помощью Serverless вы можете развернуть приложение Node всего за несколько шагов.

Предпосылки

Чтобы продолжить работу с этим руководством, вам необходимо настроить следующее:

  • Аккаунт AWS. Если вы только экспериментируете с AWS, вы можете присоединиться к уровню бесплатного пользования, не платя ни копейки.
  • Создайте пользователя IAM в консоли AWS. Следуйте инструкциям в этой статье, чтобы создать пользователя IAM. Не забудьте сохранить идентификатор ключа доступа и секретный ключ доступа, прежде чем переходить к следующему шагу.

Установить и настроить бессерверную версию

Вы можете легко установить Serverless с помощью npm. Выполните следующую команду, чтобы установить его глобально:

npm install -g serverless

Затем настройте Serverless с ключами IAM, используя следующую команду. Используйте идентификатор и ключ, сохраненные при создании пользователя IAM, как ключ и секрет соответственно:

sls config credentials --provider aws --key xxx --secret xxx

Создайте приложение узла

Я создал простое приложение Hello World для этого руководства, но вы можете развертывать более сложные приложения, следуя той же логике:

Как вы можете видеть выше, мы используем пакет serverless-http npm для настройки бессерверного приложения, поэтому убедитесь, что у вас установлен пакет. Вы можете установить библиотеку с помощью:

npm install --save express serverless-http

Создайте файл serverless.yml

Мы используем файл с именем serverless.yml для передачи бессерверных конфигураций. Для нашего простого приложения он содержит следующие свойства:

Здесь в свойстве functions перечислены все функции в нашем приложении. Мы передаем единственную функцию с именем app и используем экспортированную ссылку на обработчик в файле app.js в качестве обработчика функции.

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

Использование /{proxy+} пересылает каждый запрос, позволяя приложению Express обрабатывать каждый запрос самостоятельно, вместо того, чтобы обрабатывать запросы на уровне шлюза API.

Развернуть приложение

Теперь, когда мы передали нашу конфигурацию serverless.yml, для развертывания приложения требуется только одна команда:

sls deploy

И его результат будет выглядеть так:

Поздравляю! Вы успешно развернули свое первое бессерверное приложение в AWS.

Вы можете посетить развернутое приложение по ссылкам, указанным под конечными точками. Если вы посетите корень, вы увидите сообщение «Hello World».

Маршрутизация по конкретному пути

Помните, как мы проксировали все маршруты в приложение Express? Хотя у этой реализации есть свои преимущества (например, ограничение холодных запусков), мы упускаем из виду некоторые особенности бессерверной архитектуры.

Вместо маршрутизации всех путей с помощью одной лямбда-функции мы можем ввести маршруты для конкретных путей, которые обрабатываются разными лямбда-функциями. Это позволяет нам лучше понять приложение, используя метрики, зависящие от пути.

В этом случае обновите serverless.yml следующим образом, чтобы разные функции обрабатывали каждый путь:

Добавление переменных среды

Если вы хотите передать переменные среды в приложение, вы можете использовать свойство environment.

Например, если вы хотите передать переменную NODE_ENV, вы можете настроить ее следующим образом:

Если вы хотите передать переменные среды из файла .env, вам нужно использовать serverless-dotenv-plugin.

Сначала установите плагин как зависимость для разработки:

npm install serverless-dotenv-plugin --save-dev

Затем вы можете создать файл .env в корневом каталоге и добавить в него переменные среды:

STAGE=dev
SECRET=**********

После того, как вы указали dotenv-plugin в подключаемых модулях приложения, вы можете импортировать сохраненные переменные среды и использовать их в файле serverless.yml:

Использовать бессерверный автономный режим

До этого момента нам приходилось развертывать наше приложение, чтобы проводить даже простейшие тесты маршрутов. Вам нужно всего лишь написать 2-3 новых маршрута в своем приложении, чтобы понять, насколько это раздражает.

Что, если бы существовал способ протестировать ваше приложение перед его развертыванием в AWS?

Это можно сделать с помощью подключаемого модуля serverless-offline. Вам нужно только установить новый пакет npm и добавить одну новую строку кода в файл serverless.yml, чтобы все заработало.

Сначала установите пакет:

npm install serverless-offline --save-dev

Затем обновите serverless.yml:

plugins:
  - serverless-offline
  - serverless-dotenv-plugin

Теперь вам просто нужно выполнить следующую команду, чтобы запустить приложение локально:

sls offline start

Он покажет вам список всех маршрутов в вашем приложении. Кроме того, что наиболее важно, он запускает ваше приложение, работающее локально на порту 3000.

Теперь вы можете протестировать маршруты приложений, посетив их в своем браузере с URL-адресом http: // localhost: 3000.

Резюме

Бессерверная архитектура по сравнению с серверами все еще находится на раннем этапе развития. Вы можете рассчитывать на то, что в ближайшие годы он станет еще более мощным и заметным. Я надеюсь, что ваш первый опыт использования Serverless и AWS Lambda побудил вас дать этой технологии шанс в следующий раз, когда вы будете искать вариант развертывания.

Спасибо за прочтение!