Заметки про Serverless - часть 1

6 мин. чтения

Serverless in the Clouds

Решил написать небольшие заметки по построению простого 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:

  1. В главном меню сверху ищем в сервисах IAM и переходим в него
  2. В меню слева выбираем пункт Users и начинаем создавать нового пользователя, нажав кнопку Add user. В форме создания юзера указываем название пользователя, например sls-agent. Дальше ставим галочку напротив Programmistic access и переходим на следующую страницу.
  3. На странице выбора прав, выбираем вкладку Attach existing policies directly и нажимаем кнопку Create policy.
  4. В открывшейся новой вкладке выбираем режим представления JSON вместо Visual Editor и внутрь текстового поля вставляем следующее содержимое из этого gist. Нажимаем кнопку Review policy, указываем имя Serverless и создаем политику кнопкой Create policy.
  5. Закрываем вкладку и возвращаемся к прошлой странице, где необходимо выбрать политики для пользователя. На этой странице мы нажимаем кнопку обновления данных (над таблицей справа) и в фильтре вводим название созданной политики: Serverless. Ставим галочку напротив найденной политики и переходим в следующий раздел кнопкой Next: Tags
  6. Оставляем все пустым и переходим далее кнопкой Next: Review. Ознакомившись с данными пользователя, нажимаем Create user.
  7. Копируем к себе 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

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

Оставить отзыв или задать вопрос лично по email