Перейти к содержимому

Экономика облаков: стоимость как инженерная дисциплина

Облако обещает «плати только за то, что используешь». Правда, оно не упоминает, что «используешь» ты будешь неожиданно много — и узнаешь об этом из счёта. Оптимизация стоимости в облаке — это не бухгалтерия, а инженерная дисциплина: те же паттерны мышления, что и при проектировании системы. Ты оцениваешь варианты, считаешь компромиссы и принимаешь решение с цифрами в руках.

В этой главе разберём четыре модели оплаты, научимся считать TCO до деплоя, а в конце — честный расчёт реального сценария: одна и та же архитектура на Hetzner и на AWS, с цифрами, из которых видно, за что именно ты платишь гигантскому провайдеру.

Платишь за каждый час (EC2) или секунду (Lambda, Fargate) работы. Никаких обязательств — включил, выключил, перешёл на другой тип. Цена — базовая, самая высокая. Это модель для непредсказуемого, экспериментального и краткосрочного.

Покупаешь инстанс на год или три с предоплатой (вся сумма, часть или ноль — чем больше платишь вперёд, тем больше скидка). Скидка: до 40% на год, до 72% на три года. Резерв привязан к конкретному типу инстанса и региону: поменял t3.large на m6i.large — резерв больше не покрывает старый, придётся продавать/менять на бирже. Все четыре модели оплаты EC2 сравнены в официальном гайде по purchasing options.

Эволюция Reserved: ты обязуешься тратить $X в час (например, $0.50/час в течение года) на любые вычисления семейства (EC2, Fargate, Lambda). Скидка до 66% (Compute Savings Plans) или до 72% (EC2 Instance Savings Plans, но с привязкой к региону и семейству). Гибче Reserved: поменял тип инстанса — обязательство просто продолжает списываться с нового.

Стратегия покрытия нагрузки:
Нагрузка
│ ┌── Savings Plans / Reserved (стабильное ядро, 24/7)
│ ╱────┘
│ ╱───┘───── On-Demand (всплески, короткоживущие)
│ ╱
│╱ ─ ─ Spot (фоновые задачи, терпимые к остановке)
└──────────────────────────────► время

Правило покрытия: стабильное ядро (то, что работает всегда — база, основные приложения) закрываем Savings Plans или Reserved, всплески оставляем On-Demand, фон — Spot.

Spot-инстансы — это неиспользуемая мощность AWS, которую продают с аукциона. Скидка до 90% от On-Demand. Цена плавает; когда спрос на мощность растёт, AWS отзывает инстанс с предупреждением за 2 минуты (уведомление приходит через метаданные инстанса и EventBridge).

Подходит для всего, что умеет переживать остановку и возобновляться: CI-раннеры, рендер-фермы, воркеры очередей, batch-обработка, stateless-воркеры за балансировщиком. Не подходит для баз данных и всего stateful без репликации.

Окно терминала
# Запросить спот-флот: 2 инстанса, не дороже цены On-Demand t3.large
aws ec2 request-spot-fleet \
--spot-fleet-request-config file://fleet.json
# fleet.json
{
"IamFleetRole": "arn:aws:iam::123456789012:role/aws-ec2-spot-fleet-role",
"AllocationStrategy": "capacity-optimized",
"TargetCapacity": 2,
"SpotPrice": "0.0832",
"LaunchSpecifications": [{
"ImageId": "ami-0c02fb55956c7d316",
"InstanceType": "t3.large",
"SubnetId": "subnet-0abc",
"UserData": "IyEvYmluL2Jhc2gK..."
}]
}

Главная метрика для спота — частота прерываний (AWS публикует её по типам инстансов и AZ; выбирай типы с <5%). Для воркеров очереди прерывание безболезненно: сообщение не получило ACK — вернётся в очередь, доставит другой инстанс. Для CI та же история: джоба умирает — раннер перезапускается.

Total Cost of Ownership — полная стоимость владения системой, а не только цена инстанса. Формула для облачного сервиса:

TCO/мес = вычисления + хранение + сеть (egress!) + управляемые сервисы
+ наблюдаемость (логи, метрики) + человеческое время на эксплуатацию

Пункты, которые новички стабильно забывают:

  • Egress — исходящий трафик. Входящий в AWS бесплатен, исходящий — $0.09/ГБ после первого 100 ГБ. Отдаёшь пользователям 2 ТБ статики в месяц — это ~$180 только за трафик. Отсюда правило: статику — на CDN (CloudFront, цена за трафик ниже + кэширование снижает egress с origin).
  • Хранение растёт. EBS-снапшоты, S3-версии, логи CloudWatch, старые Docker-образы в ECR. Ставь lifecycle везде, где можно.
  • Мелкие сервисы капают. NAT Gateway ($32/мес + $0.045/ГБ), Route 53 ($0.50 за зону + $0.40 за миллион запросов), Secrets Manager ($0.40 за секрет в месяц), per-request цены SQS/Lambda. По отдельности копейки, в сумме — заметная строка.

Инструменты оценки: AWS Pricing Calculator (собираешь архитектуру из компонентов — получаешь помесячную смету), AWS Cost Explorer (фактические расходы по сервисам после запуска — гайд по отчётам в документации Cost Explorer), аналогичные калькуляторы у GCP и Azure — для сравнения.

# scripts/estimate.py — грубая оценка сценария до деплоя
# Помнишь раздел про Python? Вот его честное применение.
COMPUTE = 2 * 30.37 # 2× t3.large On-Demand, $/мес
RDS = 15 + 20 * 0.115 # db.t3.micro + 20 GB gp3
S3 = 100 * 0.023 # 100 GB Standard
EGRESS = 500 * 0.09 # 500 GB отдаём наружу
NAT = 730 * 0.045 + 400 * 0.045 # час работы + 400 GB через NAT
LOGS = 10 # CloudWatch, грубо
TOTAL = COMPUTE + RDS + S3 + EGRESS + NAT + LOGS
print(f"Итого ≈ ${TOTAL:.0f}/мес") # ≈ $250/мес — сюрприз для «двух виртуалок»

Когда в одном аккаунте живут несколько сред (dev/stage/prod) или проектов, нужно знать, кто сколько тратит. Механизм — теги: пары ключ=значение на каждом ресурсе.

Окно терминала
# Создать инстанс с обязательными тегами — через CLI
aws ec2 run-instances ... \
--tag-specifications 'ResourceType=instance,Tags=[
{Key=Environment,Value=prod},
{Key=Project,Value=petapp},
{Key=Team,Value=platform},
{Key=CostCenter,Value=cc-104}
]'
# Финансовый отчёт: расходы по проектам за прошлый месяц
aws ce get-cost-and-usage \
--time-period Start=2026-08-01,End=2026-09-01 \
--granularity MONTHLY \
--metrics BlendedCost \
--group-by Type=TAG,Key=Project

Обязательный минимум тегов: Environment, Project, Owner (кто отвечает за ресурс). Дальше — CostCenter для компаний, AutoShutdown=true для dev-сред, которые можно гасить на ночь. AWS Billing консолидирует расходы по тегам в Cost Explorer и в CSV-отчётах (отчёт «Cost and Usage Report» выгружается в S3 и разбирается чем угодно). Механика активации тегов в биллинге — в гайде по cost allocation tags.

AWS Budgets — сервис бюджетов с уведомлениями (полный гайд — в документации AWS Budgets). Три типа, которые стоит настроить в каждом аккаунте до первого ресурса:

  1. Общий месячный бюджет с порогами 50% / 80% / 100% — на почту и в SNS-топик.
  2. Бюджет на anomalous spend — AWS сам сравнивает расходы с историей и шлёт алерт при отклонении (например, «обычно $30/день, сегодня уже $200»). Ловит утечки и забытые ресурсы.
  3. Zero-spend budget на $1 — срабатывает, если вообще что-то начало тратиться. Идеален для учебных аккаунтов.
Окно терминала
aws budgets create-budget \
--account-id 123456789012 \
--budget '{
"BudgetName": "monthly-prod",
"BudgetLimit": {"Amount": "100", "Unit": "USD"},
"TimeUnit": "MONTHLY", "BudgetType": "COST",
"CostFilters": {"TagKeyValue": ["user:Environment$prod"]}
}' \
--notifications-with-subscribers '[{
"Notification": {
"NotificationType": "ACTUAL",
"ComparisonOperator": "GREATER_THAN",
"Threshold": 80
},
"Subscribers": [{"SubscriptionType": "EMAIL", "Address": "oncall@example.com"}]
}]'

Второй рубеж — Cost Anomaly Detection (отдельный сервис) и AWS Config rules: например, правило, которое помечает инстансы без тега Owner, или лямбда, гасящая dev-инстансы в 20:00.

Правильный размер ресурса — самый большой и самый скучный источник экономии. Процесс:

  1. Собери факты. Метрики CloudWatch за 2–4 недели: CPU (среднее, p95, максимум), сетевой трафик, IOPS диска, память (через агент).
  2. Найди простаивающее. EC2 с CPU < 5% неделю — кандидат на понижение типа или на перевод в Lambda/Fargate. RDS с 2 ГБ данных на диске в 100 ГБ — уменьши диск (gp3 позволяет).
  3. Проверь burstable-инстансы. t3 копит CPU-кредиты; если кредиты постоянно на нуле — переходи на m-семейство, если всегда полные — t избыточен.
  4. Пересматривай регулярно. Нагрузка растёт; то, что год назад было right-sized, сегодня — узкое место или переплата.
Окно терминала
# Найти кандидатов на уменьшение: средний CPU < 10% за 14 дней
aws cloudwatch get-metric-statistics \
--namespace AWS/EC2 --metric-name CPUUtilization \
--dimensions Name=InstanceId,Value=i-0abc123 \
--start-time 2026-08-23 --end-time 2026-09-06 \
--period 86400 --statistics Average \
--query 'sort_by(Datapoints, &Average)[*].[Timestamp, Average]'

Типичный результат первого аудита у команды без практики оптимизации: 20–40% экономии без потери производительности, просто потому что ресурсы выбирались «с запасом на всякий случай» полгода назад.

Реальный расчёт: маленький SaaS на Hetzner против AWS

Заголовок раздела «Реальный расчёт: маленький SaaS на Hetzner против AWS»

Сценарий: SaaS-мониторинг для малого бизнеса. API на Node.js, Postgres, Redis, фоновые воркеры, отдаёт ~300 ГБ/мес пользователям. Нагрузка: ~200 RPS в пике, хранилище растёт на 30 ГБ/мес.

Вариант A: Hetzner (виртуалки + самостоятельная эксплуатация)

Строка Конфигурация Цена/мес
App ×2 CX22 (2 vCPU/4 GB) ×2 за ALB €8.80
База CCX13 (dedicated 2 vCPU/8 GB), Postgres + PgBouncer €16.90
Redis CX12 на том же хосте что бэкенд-воркер €4.50
Бэкапы Снапшоты + второй бакет (S3-совместимое у Hetzner, 100 ГБ) €6.00
Трафик 300 ГБ — в пределах включённых 20 ТБ €0
Мониторинг Prometheus + Grafana self-hosted €0 (время)
Итого ≈ €36 (~$40)

Человеческое время: ~2–4 часа/мес на патчи, бэкапы, восстановления (учимся и считаем нулём — но помни, что это навык, а не бесплатность).

Вариант B: AWS (managed-стек)

Строка Конфигурация Цена/мес
App ×2 t3.medium ×2 + ALB ~$61 + $16
База RDS db.t3.micro Multi-AZ + 30 GB gp3 ~$36
Redis ElastiCache serverless ~$20
Egress 300 ГБ × $0.09 ~$27
NAT Gateway + 300 ГБ обработки ~$46
Логи/мониторинг CloudWatch базовый ~$10
S3 Бэкапы 100 ГБ, версионирование ~$3
Итого ≈ $219

Разница: ~5.5× в пользу Hetzner. За что платит вариант B: Multi-AZ failover из коробки, managed-всё (меньше времени на эксплуатацию), автомасштабирование, compliance-инфраструктура, готовность к росту на порядки.

Когда B выигрывает: SLA перед Enterprise-клиентами, команда без опыта эксплуатации БД, непредсказуемый рост, требования к резервированию данных (Multi-AZ + cross-region). Когда A выигрывает: 95% маленьких SaaS — пока выручка не оправдывает managed-премию.

Прагматичная середина, которую выбирают многие: Hetzner за вычисления + S3 за бэкапы + CloudFront за раздачу статики. Лучшее из обоих миров по цене.

  1. «Сэкономим» отключив алерты. Бюджет без уведомлений — дневник расходов, а не ограничение. Пороги 50/80/100% на почту — 10 минут настройки, бесконечная польза.
  2. Reserved на всё подряд. Зарезервировал три года то, что через полгода переедет в Kubernetes или на другой тип инстанса — обязательство осталось. Резервируй только то, что точно живёт 24/7: базы, стабильные app-серверы. Всё остальное — Savings Plans или On-Demand.
  3. Spot для stateful-нагрузки. Джоба на спот-инстансе с локальным состоянием умирает вместе с инстансом. Спот — только с внешним состоянием (S3, очередь, БД).
  4. Egress в смете отсутствует. Классика: архитектура посчитана, деплоится, счёт в три раза больше — потому что 500 ГБ/мес уходят пользователям, а в смете был только инстанс.
  5. Теги приделываются задним числом. Невозможно узнать, сколько стоит «тот экспериментальный проект», если у его ресурсов нет тега Project с момента создания. Тегирование — часть IaC-шаблона, не ручная привычка.
  6. Оптимизация до измерения. Не покупай Reserved до того, как месяц посмотрел реальную утилизацию в Cost Explorer. Право-сайзинг раньше резерва: сначала убедись, что размер верный.
  1. Чем Savings Plans отличаются от Reserved Instances? Reserved привязывается к конкретному типу инстанса и региону; Savings Plans — к обязательству тратить $X/час на семейство сервисов, менять типы можно свободно. SP гибче, RI даёт чуть большую скидку при полной привязке.
  2. Когда Spot-инстансы не подходят? Для stateful-нагрузки и всего, что не переживает внезапную остановку: базы данных, очереди с in-flight состоянием на диске инстанса, долгие синхронные запросы.
  3. Как узнать, на чём тратится больше всего в аккаунте? Cost Explorer: отчёт по сервисам, сортировка по BlendedCost, фильтры по тегам и регионам. Для программного доступа — aws ce get-cost-and-usage.
  4. Что такое cost-аллокация и зачем теги? Разнесение расходов по проектам/командам/средам. Без тегов облако — общий котёл; с тегами — прозрачная бухгалтерия, по которой можно ставить бюджеты на команду и находить бесхозные ресурсы.
  5. Почему egress дешевле на CDN, чем напрямую с инстансов? CDN кэширует на edge-точках: повторные запросы не идут в origin, egress с origin падает на порядки. Плюс цена за ГБ на CloudFront ниже, чем прямой egress из региона.
  6. Дай три способа сократить облачный счёт на треть. Right-sizing недогруженных инстансов; Reserved/Savings Plans на стабильное ядро; lifecycle-политики на S3 и логи. Бонус: спот-флот для CI и воркеров.
  1. Настрой в учебном аккаунте AWS три бюджета из главы (месячный, anomalous, zero-spend) с уведомлением на почту. Проверь: создай временный инстанс и убедись, что алерт пришёл.
  2. Открой AWS Pricing Calculator и собери смету своего pet-проекта: 2 app-инстанса, RDS Multi-AZ, 50 ГБ S3, 200 ГБ egress, NAT, логи. Сохрани смету как JSON и прикинь, как изменится цена при росте пользовательской базы в 10 раз (что растёт линейно, что — нет).
  3. Посчитай ту же архитектуру на Hetzner/DO вручную. Выведи коэффициент разницы и напиши (для себя) три условия, при которых разница оправдана.
  4. Проставь теги Environment, Project, Owner на все ресурсы pet-проекта через IaC (или руками, если IaC ещё нет). Выгрузи Cost and Usage Report в S3 и построй отчёт по Project в Cost Explorer.
  5. Найди один кандидата на right-sizing: инстанс, БД или бакет, который потребляет заметно меньше, чем выделено. Опиши, что поменяешь, сколько сэкономишь и какие риски.