Экономика облаков: стоимость как инженерная дисциплина
Облако обещает «плати только за то, что используешь». Правда, оно не упоминает, что «используешь» ты будешь неожиданно много — и узнаешь об этом из счёта. Оптимизация стоимости в облаке — это не бухгалтерия, а инженерная дисциплина: те же паттерны мышления, что и при проектировании системы. Ты оцениваешь варианты, считаешь компромиссы и принимаешь решение с цифрами в руках.
В этой главе разберём четыре модели оплаты, научимся считать TCO до деплоя, а в конце — честный расчёт реального сценария: одна и та же архитектура на Hetzner и на AWS, с цифрами, из которых видно, за что именно ты платишь гигантскому провайдеру.
Четыре модели оплаты за вычисления
Заголовок раздела «Четыре модели оплаты за вычисления»On-Demand: гибкость по максимальной цене
Заголовок раздела «On-Demand: гибкость по максимальной цене»Платишь за каждый час (EC2) или секунду (Lambda, Fargate) работы. Никаких обязательств — включил, выключил, перешёл на другой тип. Цена — базовая, самая высокая. Это модель для непредсказуемого, экспериментального и краткосрочного.
Reserved Instances: обязательство на инстанс
Заголовок раздела «Reserved Instances: обязательство на инстанс»Покупаешь инстанс на год или три с предоплатой (вся сумма, часть или ноль — чем больше платишь вперёд, тем больше скидка). Скидка: до 40% на год, до 72% на три года. Резерв привязан к конкретному типу инстанса и региону: поменял t3.large на m6i.large — резерв больше не покрывает старый, придётся продавать/менять на бирже. Все четыре модели оплаты EC2 сравнены в официальном гайде по purchasing options.
Savings Plans: обязательство на потребление
Заголовок раздела «Savings Plans: обязательство на потребление»Эволюция 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: дёшево, но могут забрать
Заголовок раздела «Spot: дёшево, но могут забрать»Spot-инстансы — это неиспользуемая мощность AWS, которую продают с аукциона. Скидка до 90% от On-Demand. Цена плавает; когда спрос на мощность растёт, AWS отзывает инстанс с предупреждением за 2 минуты (уведомление приходит через метаданные инстанса и EventBridge).
Подходит для всего, что умеет переживать остановку и возобновляться: CI-раннеры, рендер-фермы, воркеры очередей, batch-обработка, stateless-воркеры за балансировщиком. Не подходит для баз данных и всего stateful без репликации.
# Запросить спот-флот: 2 инстанса, не дороже цены On-Demand t3.largeaws 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 та же история: джоба умирает — раннер перезапускается.
TCO: считаем до деплоя
Заголовок раздела «TCO: считаем до деплоя»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 gp3S3 = 100 * 0.023 # 100 GB StandardEGRESS = 500 * 0.09 # 500 GB отдаём наружуNAT = 730 * 0.045 + 400 * 0.045 # час работы + 400 GB через NATLOGS = 10 # CloudWatch, грубоTOTAL = COMPUTE + RDS + S3 + EGRESS + NAT + LOGSprint(f"Итого ≈ ${TOTAL:.0f}/мес") # ≈ $250/мес — сюрприз для «двух виртуалок»Cost-аллокация: теги как бухгалтерия
Заголовок раздела «Cost-аллокация: теги как бухгалтерия»Когда в одном аккаунте живут несколько сред (dev/stage/prod) или проектов, нужно знать, кто сколько тратит. Механизм — теги: пары ключ=значение на каждом ресурсе.
# Создать инстанс с обязательными тегами — через CLIaws 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). Три типа, которые стоит настроить в каждом аккаунте до первого ресурса:
- Общий месячный бюджет с порогами 50% / 80% / 100% — на почту и в SNS-топик.
- Бюджет на anomalous spend — AWS сам сравнивает расходы с историей и шлёт алерт при отклонении (например, «обычно $30/день, сегодня уже $200»). Ловит утечки и забытые ресурсы.
- 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.
Right-sizing: ресурсы под реальную нагрузку
Заголовок раздела «Right-sizing: ресурсы под реальную нагрузку»Правильный размер ресурса — самый большой и самый скучный источник экономии. Процесс:
- Собери факты. Метрики CloudWatch за 2–4 недели: CPU (среднее, p95, максимум), сетевой трафик, IOPS диска, память (через агент).
- Найди простаивающее. EC2 с CPU < 5% неделю — кандидат на понижение типа или на перевод в Lambda/Fargate. RDS с 2 ГБ данных на диске в 100 ГБ — уменьши диск (gp3 позволяет).
- Проверь burstable-инстансы.
t3копит CPU-кредиты; если кредиты постоянно на нуле — переходи наm-семейство, если всегда полные —tизбыточен. - Пересматривай регулярно. Нагрузка растёт; то, что год назад было 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 за раздачу статики. Лучшее из обоих миров по цене.
Типичные ошибки и грабли
Заголовок раздела «Типичные ошибки и грабли»- «Сэкономим» отключив алерты. Бюджет без уведомлений — дневник расходов, а не ограничение. Пороги 50/80/100% на почту — 10 минут настройки, бесконечная польза.
- Reserved на всё подряд. Зарезервировал три года то, что через полгода переедет в Kubernetes или на другой тип инстанса — обязательство осталось. Резервируй только то, что точно живёт 24/7: базы, стабильные app-серверы. Всё остальное — Savings Plans или On-Demand.
- Spot для stateful-нагрузки. Джоба на спот-инстансе с локальным состоянием умирает вместе с инстансом. Спот — только с внешним состоянием (S3, очередь, БД).
- Egress в смете отсутствует. Классика: архитектура посчитана, деплоится, счёт в три раза больше — потому что 500 ГБ/мес уходят пользователям, а в смете был только инстанс.
- Теги приделываются задним числом. Невозможно узнать, сколько стоит «тот экспериментальный проект», если у его ресурсов нет тега
Projectс момента создания. Тегирование — часть IaC-шаблона, не ручная привычка. - Оптимизация до измерения. Не покупай Reserved до того, как месяц посмотрел реальную утилизацию в Cost Explorer. Право-сайзинг раньше резерва: сначала убедись, что размер верный.
Вопросы на собеседовании
Заголовок раздела «Вопросы на собеседовании»- Чем Savings Plans отличаются от Reserved Instances? Reserved привязывается к конкретному типу инстанса и региону; Savings Plans — к обязательству тратить $X/час на семейство сервисов, менять типы можно свободно. SP гибче, RI даёт чуть большую скидку при полной привязке.
- Когда Spot-инстансы не подходят? Для stateful-нагрузки и всего, что не переживает внезапную остановку: базы данных, очереди с in-flight состоянием на диске инстанса, долгие синхронные запросы.
- Как узнать, на чём тратится больше всего в аккаунте? Cost Explorer: отчёт по сервисам, сортировка по BlendedCost, фильтры по тегам и регионам. Для программного доступа —
aws ce get-cost-and-usage. - Что такое cost-аллокация и зачем теги? Разнесение расходов по проектам/командам/средам. Без тегов облако — общий котёл; с тегами — прозрачная бухгалтерия, по которой можно ставить бюджеты на команду и находить бесхозные ресурсы.
- Почему egress дешевле на CDN, чем напрямую с инстансов? CDN кэширует на edge-точках: повторные запросы не идут в origin, egress с origin падает на порядки. Плюс цена за ГБ на CloudFront ниже, чем прямой egress из региона.
- Дай три способа сократить облачный счёт на треть. Right-sizing недогруженных инстансов; Reserved/Savings Plans на стабильное ядро; lifecycle-политики на S3 и логи. Бонус: спот-флот для CI и воркеров.
Практика
Заголовок раздела «Практика»- Настрой в учебном аккаунте AWS три бюджета из главы (месячный, anomalous, zero-spend) с уведомлением на почту. Проверь: создай временный инстанс и убедись, что алерт пришёл.
- Открой AWS Pricing Calculator и собери смету своего pet-проекта: 2 app-инстанса, RDS Multi-AZ, 50 ГБ S3, 200 ГБ egress, NAT, логи. Сохрани смету как JSON и прикинь, как изменится цена при росте пользовательской базы в 10 раз (что растёт линейно, что — нет).
- Посчитай ту же архитектуру на Hetzner/DO вручную. Выведи коэффициент разницы и напиши (для себя) три условия, при которых разница оправдана.
- Проставь теги
Environment,Project,Ownerна все ресурсы pet-проекта через IaC (или руками, если IaC ещё нет). Выгрузи Cost and Usage Report в S3 и построй отчёт поProjectв Cost Explorer. - Найди один кандидата на right-sizing: инстанс, БД или бакет, который потребляет заметно меньше, чем выделено. Опиши, что поменяешь, сколько сэкономишь и какие риски.
Что почитать
Заголовок раздела «Что почитать»- AWS Cloud Financial Management — официальный хаб: Cost Explorer, Budgets, Anomaly Detection, CUR.
- AWS Pricing Calculator — смета архитектуры до деплоя.
- Spot Instance Advisor — частоты прерываний по типам инстансов и регионам.
- AWS Well-Architected — Cost Optimization Pillar — систематизация практик экономии.
- Hetzner Pricing — бенчмарк «сколько стоит то же самое без managed-преми».