Сделайте свой 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 побудил вас дать этой технологии шанс в следующий раз, когда вы будете искать вариант развертывания.
Спасибо за прочтение!