TL;DR
- Infracost показывает влияние изменений Terraform на стоимость в каждом PR — до деплоймента, а не после выставления счёта
- Политики стоимости могут блокировать PR, превышающие пороги (как сканеры безопасности блокируют уязвимости)
- Ошибка #1: относиться к review стоимости как к опциональному, а не автоматизированному gate
Подходит для: Команд со значительными затратами на cloud или тех, кого удивляли счета Пропустите, если: Вы на бесплатном тарифе или инфраструктуре с фиксированной ценой Время чтения: 9 минут
Ваш Terraform PR выглядит хорошо. Тесты проходят, сканирование безопасности чистое, одобрено двумя ревьюерами. Вы делаете merge. Приходит счёт AWS за следующий месяц: на $47,000 больше бюджета. Кто-то добавил RDS инстанс db.r6g.4xlarge, где хватило бы db.t3.medium.
Это gap FinOps — решения по инфраструктуре без видимости стоимости. В 2026 году оценка стоимости принадлежит CI наравне со сканированием безопасности. Вы не должны деплоить то, что не можете себе позволить.
Настоящая Проблема
Облачные затраты не остаются предсказуемыми, потому что обратная связь по стоимости приходит слишком поздно. Цикл биллинга — месячный. К моменту когда вы видите влияние, ресурсы работали уже недели.
Традиционные подходы к управлению затратами:
- Бюджетные алерты срабатывают после того, как вы перерасходовали
- Ежемесячные review стоимости происходят после деплоймента ресурсов
- Ручные оценки которые неверны или вообще пропускаются
Shift-left подход для стоимости:
- Каждый PR показывает оценку изменения месячной стоимости
- Политики стоимости блокируют изменения, превышающие пороги
- Атрибуция стоимости происходит во время деплоя, а не в конце месяца
Это не про экономию на мелочах — это про то, чтобы сделать стоимость инженерной заботой первого класса наряду с производительностью и безопасностью.
Infracost: Стандартный Инструмент
Infracost стал де-факто стандартом для оценки стоимости Terraform. Он парсит ваши Terraform файлы, запрашивает API цен облачных провайдеров и выдаёт разбивку стоимости.
# Установка
brew install infracost
# Аутентификация (доступен бесплатный тариф)
infracost auth login
# Базовая разбивка стоимости
infracost breakdown --path ./terraform
# Сравнение двух состояний (для diff в PR)
infracost diff --path ./terraform --compare-to infracost-base.json
Output показывает стоимость существующих и новых ресурсов:
Project: terraform
Name Monthly Qty Unit Monthly Cost
aws_instance.web
├─ Instance usage (Linux/UNIX, on-demand, t3.large)
│ 730 hours $60.74
└─ root_block_device
└─ Storage (gp3) 50 GB $4.00
aws_rds_instance.database
├─ Database instance (on-demand, db.r6g.4xlarge)
│ 730 hours $1,752.40
└─ Storage (gp2) 100 GB $11.50
OVERALL TOTAL $1,828.64
Ключевой инсайт: вы видите точные цены до terraform apply.
Интеграция CI/CD
Infracost блистает при интеграции в workflow PR. Вот настройка GitHub Actions:
name: Cost Estimation
on:
pull_request:
paths:
- 'terraform/**'
jobs:
infracost:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- uses: actions/checkout@v4
- name: Setup Infracost
uses: infracost/actions/setup@v3
with:
api-key: ${{ secrets.INFRACOST_API_KEY }}
- name: Generate Infracost baseline
run: |
infracost breakdown --path=terraform \
--format=json \
--out-file=/tmp/infracost-base.json
env:
INFRACOST_API_KEY: ${{ secrets.INFRACOST_API_KEY }}
- name: Generate Infracost diff
run: |
infracost diff --path=terraform \
--format=json \
--compare-to=/tmp/infracost-base.json \
--out-file=/tmp/infracost-diff.json
- name: Post PR comment
uses: infracost/actions/comment@v1
with:
path: /tmp/infracost-diff.json
behavior: update
Это постит комментарий в каждый PR с показом:
- Текущей месячной стоимости
- Стоимости после изменений
- Diff (увеличение или уменьшение)
- Разбивки по ресурсам
Политики Стоимости
Видимость — первый шаг. Второй шаг — enforcement. Infracost поддерживает policy-as-code для стоимости:
# infracost-policy.yml
version: 0.1
policies:
- policy_path: policies/cost-policy.rego
rego_url: https://raw.githubusercontent.com/infracost/infracost/master/examples/opa/policies/cost-policy.rego
Пишите политики стоимости на Rego (как в OPA):
package infracost
# Блокировать PR увеличивающие месячную стоимость более чем на $500
deny[msg] {
maxDiff := 500.0
input.diffTotalMonthlyCost > maxDiff
msg := sprintf("Monthly cost increase ($%.2f) exceeds maximum allowed ($%.2f)", [
input.diffTotalMonthlyCost,
maxDiff
])
}
# Требовать одобрение для изменений свыше $100
warn[msg] {
input.diffTotalMonthlyCost > 100
input.diffTotalMonthlyCost <= 500
msg := sprintf("Cost increase of $%.2f requires finance team approval", [
input.diffTotalMonthlyCost
])
}
# Блокировать конкретные дорогие типы инстансов
deny[msg] {
resource := input.projects[_].breakdown.resources[_]
contains(resource.name, "aws_instance")
contains(resource.metadata.instance_type, "x2idn")
msg := sprintf("Instance type x2idn not allowed without exception. Resource: %s", [resource.name])
}
Запускайте оценку политик в CI:
infracost breakdown --path ./terraform --format json | \
infracost policy --policy-path ./policies/
Код выхода 1 означает нарушение политики — блокируйте PR.
Tagging для Атрибуции Стоимости
Оценка стоимости работает лучше с правильным tagging. Enforce’ьте теги, которые позволяют атрибуцию стоимости:
# variables.tf
variable "cost_center" {
description = "Центр затрат для атрибуции биллинга"
type = string
validation {
condition = can(regex("^CC-[0-9]{4}$", var.cost_center))
error_message = "Центр затрат должен соответствовать формату CC-XXXX"
}
}
variable "environment" {
description = "Окружение (dev/staging/prod)"
type = string
validation {
condition = contains(["dev", "staging", "prod"], var.environment)
error_message = "Окружение должно быть dev, staging или prod"
}
}
# main.tf
locals {
common_tags = {
CostCenter = var.cost_center
Environment = var.environment
ManagedBy = "terraform"
Project = var.project_name
}
}
resource "aws_instance" "web" {
# ...
tags = merge(local.common_tags, {
Name = "web-server"
})
}
Комбинируйте с Compliance Testing для enforce’а политик tagging.
Обработка Usage-Based Затрат
Infracost оценивает на основе провизионированных ресурсов, но многие облачные затраты зависят от использования. Для точных оценок предоставьте данные использования:
# infracost-usage.yml
version: 0.1
resource_usage:
aws_lambda_function.api:
monthly_requests: 10000000
request_duration_ms: 250
aws_s3_bucket.data:
standard:
storage_gb: 500
monthly_tier_1_requests: 100000
monthly_tier_2_requests: 1000000
aws_dynamodb_table.users:
monthly_write_request_units: 5000000
monthly_read_request_units: 25000000
Запускайте с файлом использования:
infracost breakdown --path ./terraform --usage-file infracost-usage.yml
Для production workloads генерируйте использование из реальных метрик CloudWatch:
# Экспорт использования из работающей инфраструктуры
infracost breakdown --path ./terraform --sync-usage-file infracost-usage.yml
Multi-Environment Представления Стоимости
Большинство команд деплоят в несколько окружений. Структурируйте запуски Infracost для показа стоимости по окружениям:
# .github/workflows/cost-estimation.yml
jobs:
infracost:
strategy:
matrix:
environment: [dev, staging, prod]
steps:
- name: Infracost for ${{ matrix.environment }}
run: |
infracost breakdown \
--path=terraform/environments/${{ matrix.environment }} \
--format=json \
--out-file=/tmp/infracost-${{ matrix.environment }}.json
Агрегируйте для общего представления стоимости:
infracost output --path="/tmp/infracost-*.json" --format=table
AI-Ассистированные Подходы
Оптимизация стоимости включает понимание как моделей ценообразования, так и паттернов использования. AI инструменты ускоряют это.
Что AI делает хорошо:
- Предложение более дешёвых типов инстансов для workloads
- Выявление возможностей Reserved Instances или Savings Plans
- Объяснение моделей ценообразования для незнакомых сервисов
- Генерация файлов использования Infracost из требований
Что всё ещё требует людей:
- Решения о допустимых компромиссах стоимость vs производительность
- Понимание бизнес-контекста для распределения затрат
- Одобрение исключений для дорогих ресурсов
- Валидация что предложенные AI оптимизации реально работают
Полезный промпт:
Проанализируй эту конфигурацию Terraform и предложи оптимизации стоимости:
- Текущее: RDS инстанс db.r6g.4xlarge
- Workload: 500 QPS чтение, 50 QPS запись, 100GB хранилище
- Ограничения: Должна поддерживаться латентность p99 <10ms
Предложи альтернативные типы инстансов с оценкой месячной экономии
Когда Это Не Работает
Оценка стоимости имеет ограничения:
Точность ценообразования: Облачные провайдеры меняют цены. Лимиты бесплатного тарифа варьируются в зависимости от возраста аккаунта. Скидки за committed use не отражаются в сырых оценках.
Оценка использования: Serverless и usage-based сервисы требуют прогнозов использования. Lambda, S3 requests, data transfer — всё зависит от трафика, который вы можете не знать заранее.
Cross-resource затраты: Передача данных между ресурсами (VPC endpoints, cross-region репликация) часто доминирует в счетах, но её трудно оценить только из Terraform.
Spot/preemptible pricing: Если вы используете spot инстансы, реальные затраты значительно отличаются от оценок on-demand.
Рассмотрите дополнительные подходы:
- AWS Cost Explorer / Azure Cost Management для исторического анализа
- Бюджеты облачного провайдера для realtime алертов
- Обнаружение Drift для выявления вручную созданных дорогих ресурсов
Фреймворк Принятия Решений
Включайте Infracost на всех PR когда:
- Счёт за cloud превышает $10K/месяц
- Несколько команд деплоят независимо
- Были сюрпризы по стоимости за последний год
- Инженеры не знают облачного ценообразования
Добавляйте политики стоимости когда:
- Конкретные типы ресурсов требуют одобрения
- Лимиты бюджета — жёсткие ограничения
- Команды часто запрашивают исключения
- Рост затрат коррелирует с инцидентами (over-provisioning как “fix”)
Пропускайте оценку стоимости когда:
- Контракты с фиксированной ценой покрывают инфраструктуру
- Окружения только для разработки с auto-shutdown
- Greenfield проекты где масштаб неизвестен
Измерение Успеха
| Метрика | До | После | Как Отслеживать |
|---|---|---|---|
| Сюрпризы по стоимости за квартал | Неизвестно | 0 | Эскалации от финансов |
| Корреляция PR-к-счёту | Ручная | Автоматизированная | Infracost vs реальность |
| Время на выявление причины spike | Дни | Минуты | Логи реагирования на инциденты |
| Over-provisioned ресурсы | Неизвестно | <10% | Отчёты right-sizing |
Тревожные признаки что не работает:
- Команды игнорируют комментарии о стоимости
- Слишком много запросов на исключения политик
- Оценки постоянно расходятся с реальными счетами
- Review стоимости происходит вручную несмотря на автоматизацию
Что Дальше
Начните с видимости, затем добавьте enforcement:
- Включите Infracost на одном репозитории
- Работайте 2 спринта без политик (соберите baseline)
- Определите разумные пороги из исторических данных
- Сначала добавьте warning политики (без блокировки)
- Повысьте до блокирующих политик для явных нарушений
- Расширьте на дополнительные репозитории
Цель — сделать стоимость частью определения “готово” — изменение не завершено, пока вы не знаете сколько оно стоит.
Связанные статьи:
- Compliance тестирование для IaC
- Policy as Code Testing: OPA vs Sentinel
- Обнаружение Drift в инфраструктуре
- Тестирование Infrastructure as Code
Внешние ресурсы: