Заметки про Serverless - часть 1
6 мин. чтенияРешил написать небольшие заметки по построению простого REST API в качестве Serverless решения.
Serverless - это способ запуска веб-приложения в вакууме. Главным преимуществом такого запуска является легкость горизонтального масштабирования при увеличении нагрузок с тарификацией за использованные ресурсы.
Идеальным кейсом для использования Serverless является ситуация, когда вы создаете сервис, который неизвестно как будет расти (возможно запросов в сутки будет небольшое количество). Такой подход позволит снизить расходы на поднятие серверов, которые большую часть будут простаивать.
Технологию Serverless предлагают большинство облачных провайдеров: AWS Lambda, Azure Functions, Google Cloud Functions, Kubeless, Cloudflare Workers, Netlify Functions. По большей части они являются схожими в принципах работы, но различия кроются в деталях.
Для того, чтобы не иметь сильной привязки к провайдеру рекомендуется использовать более абстрактные решения, например Serverless Framework. Вот о нем я хочу и рассказать.
Привет мир на Serverless Framework
Любая технология требует ознакомления, поэтому начнем наше знакомство от простого к сложному.
Создаем новый проект и устанавливаем необходимые зависимости из npm:
mkdir ./serverless-hello-world && cd ./serverless-hello-world
npm init -y
npm install --save express serverless-http
npm intsall --save-dev serverless-offline
После выполнения этих команд у нас создалась директория serverless-hello-world
в которой был
инициализирован новый проект и установлены зависимости из npm.
Теперь создаем index.js
файл с таким содержанием:
const express = require('express');
const serverless = require('serverless-http');
const app = express();
app.get('/', function (req, res) {
res.send('Hello World!');
});
exports.handler = serverless(app);
Важно обратить внимание, что по факту мы создаем обычное express приложение. Но вместо запуска его
мы передаем в serverless-http
для получения обработчика, который экспортируем.
Теперь когда обработчик готов нужно описывать конфигурацию serverless.yml
:
service: hello-world
plugins:
- serverless-offline
provider:
name: aws
runtime: nodejs8.10
stage: dev
region: eu-central-1
functions:
app:
handler: index.handler
events:
- http: ANY /
- http: 'ANY {proxy+}'
Здесь указывается плагин serverless-offline
, для тестирования и отладки облачных функций на
локальном компьютере. Следом идут настройки для провайдера, в моем случае это AWS. В последней
секции перечисляются инстансы облачных функций, используемые обработчики и события, которые будут
обрабатывать эти обработчики.
Чтобы протестировать это локально, устанавливаем Serverless CLI и запускаем:
npm install -g serverless
sls offline start
Эмулятор запустится на http://localhost:3000
Публикация в Amazon Web Services
Чтобы отправить облачную функцию провайдеру, необходимо авторизоваться / зарегистрироваться в AWS и выполнить следующие шаги в Консоли AWS:
- В главном меню сверху ищем в сервисах IAM и переходим в него
- В меню слева выбираем пункт Users и начинаем создавать нового пользователя, нажав кнопку Add
user. В форме создания юзера указываем название пользователя, например
sls-agent
. Дальше ставим галочку напротив Programmistic access и переходим на следующую страницу. - На странице выбора прав, выбираем вкладку Attach existing policies directly и нажимаем кнопку Create policy.
- В открывшейся новой вкладке выбираем режим представления JSON вместо Visual Editor и внутрь
текстового поля вставляем следующее содержимое из
этого gist. Нажимаем
кнопку Review policy, указываем имя
Serverless
и создаем политику кнопкой Create policy. - Закрываем вкладку и возвращаемся к прошлой странице, где необходимо выбрать политики для
пользователя. На этой странице мы нажимаем кнопку обновления данных (над таблицей справа) и в
фильтре вводим название созданной политики:
Serverless
. Ставим галочку напротив найденной политики и переходим в следующий раздел кнопкой Next: Tags - Оставляем все пустым и переходим далее кнопкой Next: Review. Ознакомившись с данными пользователя, нажимаем Create user.
- Копируем к себе Access key ID и Secret access key и завершаем работу с Консолью AWS.
Дальше открываем терминал и изменим настройки по умолчанию для Serverless:
sls config credentials --provider aws --key YOUR_ACCESS_KEY_ID --secret YOUR_SECRET_ACCESS_KEY
Мы настроили профиль по-умолчанию, а для более сложной настройки советую посмотреть
документацию. Из простых
вариантов рекомендую использовать переменные окружения AWS_ACCESS_KEY_ID
и
AWS_SECRET_ACCESS_KEY
.
После авторизации, вы можете публиковать свои облачные функции в AWS:
sls deploy -v
Поздравляю! Ваша облачная функция теперь в облаке, а адрес по которому она доступна выведен вам в терминал. В следующих частях будем изучать работу с базой данных.