Списком
Serverless — не означає «без серверів». Сервери існують, але ви про них не думаєте. Serverless — це найвищий рівень абстракції в хмарі: розробник пише тільки функцію (бізнес-логіку), а провайдер бере на себе все інше — від провізіонування сервера до масштабування та моніторингу. Це радикально змінює підхід до розробки: замість постійно запущених серверів — функції, що виконуються тільки при надходженні подій.
Serverless — модель хмарних обчислень, за якої:
Serverless включає два компоненти:
| Характеристика | EC2 | Контейнери (ECS/EKS) | Serverless (Lambda) |
|---|---|---|---|
| Управління сервером | Клієнт | Частково | Провайдер |
| Автомасштабування | Manual / ASG | K8s HPA | Автоматично |
| Мінімум idle-вартості | EC2 running cost | 1+ Pod | $0 (масштаб до 0) |
| Початковий час відповіді | Швидко | Швидко | Cold start: десятки мс–секунди |
| Максимум виконання | Необмежено | Необмежено | 15 хв (Lambda) |
| Стан (state) | Full stateful | Stateful/Stateless | Stateless |
Ідеально для Serverless:
Не підходить для Serverless:
AWS Lambda — FaaS-сервіс AWS, запущений у 2014 році. Lambda-функція:
Lambda може бути запущена десятками тригерів:
| Тригер | Опис | Паттерн |
|---|---|---|
| API Gateway / Function URL | HTTP-запит → Lambda | Синхронний |
| S3 | Upload/Delete об’єкту → Lambda | Асинхронний |
| SQS | Повідомлення у черзі → Lambda | Polling |
| EventBridge | Scheduled cron або event rule | Асинхронний |
| DynamoDB Streams | Зміна у таблиці → Lambda | Streaming |
| SNS | Сповіщення → Lambda | Асинхронний |
| Kinesis | Потіковий запис → Lambda | Streaming |
| Step Functions | Крок у state machine | Синхронний |
import json
import boto3
# S3 client ініціалізується за межами handler для reuse між інвокаціями
s3 = boto3.client('s3')
def lambda_handler(event, context):
"""
Тригер: S3 PutObject
Обробляє завантажений JSON-файл та зберігає результат
"""
# Отримати параметри з event
bucket = event['Records'][0]['s3']['bucket']['name']
key = event['Records'][0]['s3']['object']['key']
# Зчитати файл з S3
response = s3.get_object(Bucket=bucket, Key=key)
data = json.loads(response['Body'].read())
# Обробка
processed = {
'total': sum(item['amount'] for item in data['orders']),
'count': len(data['orders'])
}
# Записати результат в S3
s3.put_object(
Bucket=bucket,
Key=f"processed/{key}",
Body=json.dumps(processed)
)
return {'statusCode': 200, 'body': json.dumps(processed)}
Cold Start (Холодний старт) — затримка при першому виклику Lambda-функції (або після тривалого простою), що пов’язана з ініціалізацією середовища виконання:
Перший запит (Cold Start):
Container Init (50–500ms) + Runtime Init (50–200ms) + Handler Init + Handler Exec
Наступні запити (Warm):
Handler Exec (мілісекунди)
Стратегії мінімізації Cold Start:
Lambda Layers: Спільні залежності (бібліотеки, конфігурації) між кількома Lambda-функціями у вигляді шарів. До 5 layers на функцію.
Environment Variables: Конфігурація через env змінні; чутливі значення — через AWS Secrets Manager або SSM Parameter Store із шифруванням KMS.
Client → API Gateway → Lambda (auth) → Lambda (business logic) → DynamoDB
│
└── JWT validation, rate limiting (API GW)
Повністю serverless REST API: нульова вартість при відсутності трафіку, масштабується до мільйонів запитів/сек.
S3: new file uploaded
→ Lambda: parse CSV → SQS: individual records
→ Lambda consumers (concurrent): validate + transform
→ DynamoDB: write results
→ DynamoDB Streams → Lambda: send notifications (SNS → Email/SMS)
AWS Step Functions — візуальний сервіс для побудови state machines з Lambda-функцій:
{
"StartAt": "ValidateOrder",
"States": {
"ValidateOrder": {
"Type": "Task",
"Resource": "arn:aws:lambda:...:ValidateOrderFunction",
"Next": "CheckInventory"
},
"CheckInventory": {
"Type": "Task",
"Resource": "arn:aws:lambda:...:CheckInventoryFunction",
"Catch": [{"ErrorEquals": ["OutOfStock"], "Next": "NotifyUser"}],
"Next": "ProcessPayment"
}
...
}
}
Вирішує проблему координації між кількома Lambda без складної логіки в коді.
Azure Functions — FaaS від Microsoft. Підтримує: C#, JavaScript, Python, Java, PowerShell, TypeScript.
Azure Durable Functions — розширення для stateful orchestration (аналог Step Functions):
Hosting Plans:
Google Cloud Functions (2nd gen):
Google Cloud Run: Хоча технічно не FaaS, Cloud Run дозволяє запускати stateless Docker-контейнер з масштабуванням до нуля:
| Обмеження | AWS Lambda | Рішення |
|---|---|---|
| Макс час виконання | 15 хв | Step Functions, EC2 Batch |
| Payload size | 6 МБ (sync) | S3 для великих даних |
| Concurrency limit | 1000 (default) | Request limit increase |
| Cold start | 50–500 мс | Provisioned Concurrency, SnapStart |
| Stateless | — | DynamoDB, ElastiCache, EFS |
| Vendor lock-in | Висока | OpenFaaS, Knative (K8s) |
Lambda calling Lambda (синхронно):
Lambda A → (sync invoke) → Lambda B → Lambda C
Проблема: при помилці в C — timeout у B, що спричиняє timeout у A. Рішення: асинхронна комунікація через SQS або Step Functions.
Монолітна Lambda (Lambdalith): Одна Lambda-функція, що містить весь backend-код. Втрачаються переваги FaaS (незалежне масштабування частин). Рішення: декомпозиція на менші функції за відповідальністю.
Serverless/FaaS є найвищим рівнем абстракції для обчислень. Модель «плати лише за виконання» та автоматичне масштабування до нуля роблять її ідеальною для event-driven та нерегулярних навантажень.
AWS Lambda підтримує десятки тригерів і є ключовим сервісом для побудови event-driven архітектур в AWS. Правильне розуміння lifecycle (cold start, warm) є критичним для продуктивності.
AWS Step Functions вирішує проблему координації між Lambda-функціями без складного коду, перетворюючи бізнес-процес на декларативну state machine.
Cold Start є головним обмеженням FaaS для latency-sensitive застосунків. Provisioned Concurrency та SnapStart є основними рішеннями.
Cloud Run (Google) та Azure Container Apps пропонують serverless-модель для контейнерів, що усуває обмеження Lambda (час виконання, обсяг payload, залежності).