Функции как услуга (Functions-as-a-Service, FaaS), такие как Amazon Web Services Lambda и Twilio Functions, могут быть недорогими средами выполнения, в которых вы платите только за ресурсы, используемые для обработки конкретного запроса, обычно измеряемые в секундах или миллисекундах.
Сегодня мы рассмотрим развертывание JavaScript Node.js приложения в AWS Lambda. Наше приложение будет хранить список наших лучших друзей, которых мы хотели бы пригласить на день рождения. В этом посте мы:
— Настроим проект npm и создадим приложение JavaScript «hello world».
— Рефакторим приложение для сбора и хранения имен друзей в памяти.
— Настроим конфигурацию serverless framework и развернем приложение в среде Lambda.
Для выполнения задач в этом посте нам понадобятся:
— Аккаунт AWS
— Установленные Node.js и npm
— Доступ к менеджеру пакетов (для целей этого поста я использую Linux и apt-get)
Давайте начнем с простого приложения «hello world». Сначала нам нужно инициализировать проект npm и установить общие библиотеки:
Теперь создадим наше приложение со страницей «hello world»:
Внутри server.js мы будем:
— Инициализировать наше express-приложение
— Определить URL и порт нашего приложения
— Добавить простое сообщение «hello world» на главную страницу
— Запустить express
Для этого вставьте этот код в `server.js`
:
Нам нужно создать скрипт запуска в файле конфигурации npm – `package.json`
:
Теперь мы можем запустить наше приложение, введя в командной строке:
Вывод этой команды должен быть:
После перехода по адресу http://localhost:8000 в браузере вы должны увидеть ваше сообщение «hello world!»:
Найдите весь код до этого момента в этом репозитории GitHub, который вы можете клонировать:
###
Создание функции списка друзей
Теперь мы собираемся добавить базовую функциональность, чтобы наш пользователь мог указать имя друга и нажать кнопку «добавить», чтобы добавить этого человека в список друзей.
Давайте добавим зависимости, которые мы будем использовать в нашем приложении:
`body-parser`
– промежуточное ПО для парсинга запросов`ejs`
– встроенные шаблоны JavaScript (для управления потоком нашего ответа, аналогично php – смешивание фрагментов кода с html)
Выполните эту команду для их установки:
Добавьте класс `InMemoryFriends`
в server.js, чтобы хранить список людей в памяти:
Теперь давайте создадим два представления для нашего приложения:
Добавьте этот код в файл `index.html`
:
Добавьте этот код в файл `person-added.html`
:
Теперь мы собираемся добавить механизм рендеринга, установить механизм представлений, указать каталог, в котором мы храним наши представления, и настроить наши новые маршруты. Добавьте следующие строки в `server.js`
в любом месте после объявления переменной `app`
:
Если вы хотите перейти к этому конкретному шагу, выполните следующие команды:
Подготовьте точку входа нашей lambda-функции, `lambda.js`
:
Нам также нужно отредактировать наш файл `server.js`
. Замените эти строки:
На:
Но подождите, разве эти строки не необходимы для запуска нашего приложения?! Да, это так.
Чтобы наше приложение работало локально, мы можем поместить их в файл `local.js`
:
И отредактируйте скрипт запуска в package.json:
После этого вам нужно настроить aws cli:
Вас попросят предоставить следующие значения:
— AWS Access Key ID
— AWS Secret Access Key
— Имя региона по умолчанию
— Формат вывода по умолчанию
Первые два наиболее важны, вы можете найти их в разделе «My Security Credentials» после входа в ваш аккаунт AWS:
Третий параметр — это ваш регион Amazon по умолчанию, вы можете оставить его по умолчанию на данный момент, так как мы собираемся определить регион в конфигурации Serverless. Четвертый — это формат, в котором вы хотите получать вывод от выполнения CLI, и он не важен в нашем случае, поэтому вы можете оставить его пустым.
Когда настройка AWS CLI завершена, настройте конфигурацию serverless. Поместите следующие строки в файл `serverless.yml`
:
И разверните нашу функцию:
Если вы все сделали правильно, вы должны увидеть вывод, похожий на:
После перехода по ссылке из вывода команды serverless (в моем случае: https://1v0xvsd7pc.execute-api.eu-central-1.amazonaws.com/production), вы должны увидеть ваше приложение, развернутое в AWS Lambda.
Но после попытки добавить друга в мой список я получаю ошибку `403 ({«message»:»Forbidden»})`
!
Вы получаете это, потому что точка входа в ваше приложение имеет префикс `/production`
. Когда вы добавляете нового друга в список, Node.js приложение пытается достичь URL https://1v0xvsd7pc.execute-api.eu-central-1.amazonaws.com/submit (а не `/production/submit`
).
У вас есть два способа решить эту проблему:
—
Вы можете изменить атрибут «action» в
`index.html`
представлении на:
—
Вы можете использовать пользовательский домен:
Теперь мы полностью настроили наше Node.js приложение в Lambda!
За несколько простых шагов мы создали Node.js приложение и развернули его на платформе function-as-a-service AWS Lambda.
Живое демо этого приложения можно найти здесь: my-serverless-app.maciejtreder.com
А репозиторий здесь: https://github.com/maciejtreder/myServerlessApp
Дайте мне знать, что вы создадите на базе этого приложения. Мои контактные данные:
contact@maciejtreder.com
https://www.maciejtreder.com
@maciejtreder (GitHub, Twitter, linkedIn)