Serverless

Оригинальная статья

Что такое Serverless #

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

Основное отличие serverless-сервисов от традиционных - тарификация: плата начисляется не за время использования, а за:

  • объём (хранимых) данных
  • утилизацию ресурсов (количество запросов и трафик)

За счет этого можно более точно спрогнозировать стоимость эксплуатации такого приложения.

Serverless-приложение - такое приложение, которое использует только serverless-сервисы.

Архитектура Lambda-функции #

  • источник события (triggering event)
  • сама функция:
    • runtime
    • deployment package (логика и зависимости)
    • layers
    • extensions
  • точка назначения функции (если она требуется):
    • S3 bucket
    • DynamoDB table
    • SQS
    • etc

Локальная разработка #

SAM

Архитектура приложения #

Следует максимально ограничить область применения функции (буквально - отдельная функция на каждый API-endpoint). Такой подход позволяет:

  • сократить время выполнения функции (то есть уменьшить стоимость решения)
  • ограничить права каждой отдельной функции в случае если требуется обращаться к нескольким сторонним ресурсам
  • более гибко масштабировать приложение

Организация кодовой базы #

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

Пример структуры репозитория:

.
├── README.md
├── requirements.txt
├── src # исходный код
│   ├── lambda # handler'ы приложения
│   └── lib # общие библиотеки
├── template.yaml
├── tests
└── venv

NB: с помощью слоёв нельзя хранить разные версии зависимостей.

Деплой #

Очевидные варианты:

  • TF
  • CF

Надстройки над ними:

Последние два позволяют описывать инфраструктуру в высокоуровневых ЯП.

Сторонние решения:

Эксплуатация #

Внутренние метрики и логи функции складываются в CloudWatch (по дефолту и при наличии требуемых разрешений).

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

Безопасность #

  • у каждой функции должна быть отдельная IAM-роль с минимально необходимым набором разрешений.
  • область применения каждой функции должна быть ограничена (Make each program function do one thing well)

Дополнительные материалы #