Что такое Serverless #
Serverless - дополнительный слой абстракции, при использовании которого нельзя напрямую влиять на нижележащую инфраструктуру сервиса.
Основное отличие serverless-сервисов от традиционных - тарификация: плата начисляется не за время использования, а за:
- объём (хранимых) данных
- утилизацию ресурсов (количество запросов и трафик)
За счет этого можно более точно спрогнозировать стоимость эксплуатации такого приложения.
Serverless-приложение - такое приложение, которое использует только serverless-сервисы.
Архитектура Lambda-функции #
- источник события (triggering event)
- сама функция:
- runtime
- deployment package (логика и зависимости)
- layers
- extensions
- точка назначения функции (если она требуется):
- S3 bucket
- DynamoDB table
- SQS
- etc
Локальная разработка #
Архитектура приложения #
Следует максимально ограничить область применения функции (буквально - отдельная функция на каждый API-endpoint). Такой подход позволяет:
- сократить время выполнения функции (то есть уменьшить стоимость решения)
- ограничить права каждой отдельной функции в случае если требуется обращаться к нескольким сторонним ресурсам
- более гибко масштабировать приложение
Организация кодовой базы #
При использовании интерпретируемых языков зависимости и общий код следует складывать в Layer - отдельное хранилище, подобной слою в контейнере и подключаемое к runtime функции.
Пример структуры репозитория:
.
├── README.md
├── requirements.txt
├── src # исходный код
│ ├── lambda # handler'ы приложения
│ └── lib # общие библиотеки
├── template.yaml
├── tests
└── venv
NB: с помощью слоёв нельзя хранить разные версии зависимостей.
Деплой #
Очевидные варианты:
- TF
- CF
Надстройки над ними:
- SAM - как абстракция над CF
- serverless.tf - как абстракция над TF
- CDK
- cdktf
Последние два позволяют описывать инфраструктуру в высокоуровневых ЯП.
Сторонние решения:
- Serverless framework - проверить актуальность
Эксплуатация #
Внутренние метрики и логи функции складываются в CloudWatch (по дефолту и при наличии требуемых разрешений).
Для отладки нескольких функций, работающих конвеером можно применять X-Ray - сервис трассировки, интегрированный в Serverless экосистему. Использование стоит отдельных денег, но его можно включать и выключать на лету.
Безопасность #
- у каждой функции должна быть отдельная IAM-роль с минимально необходимым набором разрешений.
- область применения каждой функции должна быть ограничена (Make each
programfunction do one thing well)