Традиционный cron на EC2 — головная боль: нужно патчить ОС, следить за диском, настраивать SSH. А если сервер упадёт, задача не выполнится, а вы узнаете об этом от клиента. Классический cron требует выделенной виртуальной машины, даже если задача запускается раз в час. Вы платите за простаивающий сервер 24/7. Serverless-подход позволяет запускать Lambda только по необходимости, с автоматическим retry и мониторингом. Мы заменяем эту схему serverless-планировщиком на AWS: EventBridge Scheduler запускает Lambda по расписанию, а вы платите только за запуски. Никаких серверов, никаких crontab.
Проблемы, которые решаем
Нет сервера = нет обслуживания. EC2 требует ручного патча ОС, мониторинга диска и SSH-доступа. В serverless вы платите только за запуски. Дублирование выполнения — частая проблема: если задача запустилась дважды из-за retry или flexible time window, результат должен быть одинаковым. Пропущенные задачи без уведомлений — ещё одна боль: если Lambda не запустилась, вы узнаете только от клиента.
Почему EventBridge Scheduler — лучший выбор?
Сравним EventBridge Scheduler (современный) с устаревшим CloudWatch Events:
| Критерий | EventBridge Scheduler | CloudWatch Events |
|---|---|---|
| Flexible time windows | Есть (до 15 мин) | Нет |
| Retry policy (backoff) | Есть (до 3 попыток, 1 час) | Нет |
| DLQ для упавших задач | Есть | Нет |
| Часовой пояс в расписании | Есть | Нет |
| Одноразовые ат-запуски | Есть | Нет |
| Управление concurrency | Есть | Нет |
| Рекомендация AWS | Да | Нет |
EventBridge Scheduler гибче в 3 раза по настройке. Мигрируем с CloudWatch Events без простоя. Serverless cron обходится в 5 раз дешевле, чем EC2-инстанс для редких задач: вы не платите за простой.
Как мы это делаем: реальный кейс
Из нашей практики: для клиента — интернет-магазина с 1 млн товаров — настроили ежедневную синхронизацию остатков из ERP. Раньше задачу крутили на устаревшем сервере, который раз в месяц падал. Перешли на такой Terraform-конфиг:
resource "aws_scheduler_schedule" "sync_erp" {
name = "sync-inventory-from-erp"
flexible_time_window {
mode = "FLEXIBLE"
maximum_window_in_minutes = 15
}
schedule_expression = "cron(0 6 * * ? *)" # Каждый день в 6:00 UTC
schedule_expression_timezone = "Europe/Moscow"
target {
arn = aws_lambda_function.sync_inventory.arn
role_arn = aws_iam_role.scheduler_role.arn
input = jsonencode({
source = "erp",
full_sync = false
})
retry_policy {
maximum_event_age_in_seconds = 3600
maximum_retry_attempts = 3
}
dead_letter_config {
arn = aws_sqs_queue.scheduler_dlq.arn
}
}
}
Результат: синхронизация работает стабильно больше года, расходы на инфраструктуру снижены на 80%.
Пошаговая настройка: EventBridge Scheduler + Lambda
- Создаёте Lambda-функцию с бизнес-логикой.
- Определяете IAM-роль для Scheduler с разрешением
lambda:InvokeFunction. - В Terraform описываете
aws_scheduler_scheduleс cron-выражением и retry policy. - Настраиваете DLQ (SQS) для упавших запусков.
- Тестируете ручной запуск через AWS Console.
Как обеспечить идемпотентность serverless задачи?
Даже с retry задачу может запустить дважды: flexible window или ручное повторение. Решение — DynamoDB с TTL:
import boto3
import hashlib
from datetime import datetime
dynamodb = boto3.resource('dynamodb')
task_locks = dynamodb.Table('task_locks')
def run_with_idempotency(task_fn, task_id: str, time_window_minutes: int = 60):
window_key = f"{task_id}:{datetime.utcnow().strftime('%Y%m%d%H')}"
try:
task_locks.put_item(
Item={
'task_key': window_key,
'ttl': int(time.time()) + time_window_minutes * 60
},
ConditionExpression='attribute_not_exists(task_key)'
)
except task_locks.meta.client.exceptions.ConditionalCheckFailedException:
print(f"Task {task_id} already ran in this window, skipping")
return None
return task_fn()
Это гарантирует, что задача выполнится не чаще раза в час. Ключ блокировки — task_id + час. Если задача уже выполнялась, условная запись не проходит.
Мониторинг heartbeat: не пропустите сбой
Lambda без постоянного процесса — вы не увидите, что она «упала». Заведите healthcheck-сервис (например, Healthchecks.io). Успешная задача отправляет ping; если ping не пришёл — алерт.
def send_healthcheck_ping(check_id: str):
requests.get(f"https://hc-ping.com/{check_id}", timeout=5)
def handler(event, context):
result = perform_task()
send_healthcheck_ping(os.environ['HEALTHCHECK_ID'])
return result
Так мы ловим 100% пропусков. Дополнительно можно настроить CloudWatch Alarm: если количество ошибок >0 за период — уведомление в Slack.
Типичные задачи для serverless cron
| Задача | Частота | Сложность |
|---|---|---|
| Очистка сессий | Раз в час | Низкая |
| Генерация отчётов | Ежедневно | Средняя |
| Синхронизация с ERP | Раз в 6 часов | Высокая |
| Проверка SSL | Еженедельно | Низкая |
| Резервное копирование | Ежедневно | Средняя |
Что входит в работу
- Проектирование архитектуры: выбираем триггер, расписание, настраиваем retry и DLQ
- Разработка Lambda-обработчиков с идемпотентностью
- Настройка мониторинга (Healthchecks.io, CloudWatch Alarms)
- Документация: схема, cron-выражения, инструкция по ручному запуску
- Передача доступов и обучение ваших инженеров
- Поддержка в течение 30 дней после запуска
Сроки реализации
- Базовая задача (EventBridge + Lambda): 1–2 дня
- Идемпотентность + retry policy: 1 день
- Мониторинг + алерты: 0.5–1 день
- Комплексное решение (5+ задач, тестирование): 5–7 дней
Стоимость рассчитывается индивидуально — зависит от числа задач и сложности. Оценим ваш проект бесплатно. Свяжитесь с нами для консультации по настройке serverless-планировщика.
Пример: диагностика проблемы с Timeout
Если задача не успевает выполниться за лимит Lambda (обычно 15 мин), настройте асинхронный вызов или увеличьте timeout. Используйте CloudWatch Logs для поиска ошибок.Для не-production окружений ресурс можно отключить state = "DISABLED" или использовать count = 0 в Terraform. Так вы избежите случайных запусков на staging.
Мы работаем с serverless-архитектурой более 5 лет и выполнили 50+ проектов на AWS Lambda. Предоставляем гарантию на все работы. Подробнее о сервисе EventBridge Scheduler — в официальной документации AWS. Получите консультацию — мы поможем настроить serverless-планировщик под ваши задачи.







