linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Уроки
  • How it works
  • База знаний
  • Шпаргалка
  • Capstone
  • Собеседование
home/terraform/kb/Advanced/tf-cost-infracost

kb/advanced ── Advanced ── advanced

Infracost, оценка стоимости плана

Infracost читает plan.json и считает оценочную стоимость по AWS/ GCP/Azure pricing API. Output: «текущая стоимость X $/мес, после apply станет Y, дельта Z». Используется как gate в CI: «PR поднимает стоимость на 30%, нужен approve финдиректора». Pricing-данные либо из официального cloud API (требует Infracost API-токен, бесплатно для команды до 10 чел), либо self-hosted pricing-server.

view as markdownaka: infracost, terraform-cost, cost-as-code, terraform-cost-estimation

Что Infracost даёт

Infracost cmd-line tool читает Terraform-конфиг (или plan.json) и отвечает: «сколько это будет стоить в месяц». Для каждого ресурса отдельно: EC2 (instance-type + region), RDS (class + storage), S3 (storage class + estimated traffic), и т.д.

Output (упрощённо):

Project: linuxlab/terraform-infra
Name                                Monthly Qty  Unit   Monthly Cost
aws_instance.web
├─ Instance usage (t3.large)               730  hours        $60.74
├─ root_block_device (gp3)                  50  GB-months     $4.00
└─ EBS-optimized usage                      ,  hours
aws_rds_cluster.app
├─ Database instance (db.r6g.large)       1460  hours      $234.16
└─ Storage (Aurora PostgreSQL)             100  GB-months    $11.50
OVERALL TOTAL                                                $310.40

Запуск

bash
# на HCL
infracost breakdown --path .
# на plan.json (точнее, известны computed-атрибуты)
terraform plan -out=plan.tfplan
terraform show -json plan.tfplan > plan.json
infracost breakdown --path plan.json

Plan.json режим, производственный; видит сколько именно instance-типов, storage и так далее.

Diff в PR

Сравнить с baseline'ом (предыдущим состоянием):

bash
# сохранить baseline один раз на main-ветке
infracost breakdown --path . --format json --out-file infracost-base.json
# на feature-branch
infracost diff --path . --compare-to infracost-base.json

Output показывает дельту: что добавилось, что удалилось, что изменилось по цене.

В PR-pipeline:

yaml
- run: |
    curl -fsSL https://github.com/infracost/infracost/releases/latest/download/infracost-linux-amd64.tar.gz | tar xz
    sudo mv infracost-linux-amd64 /usr/local/bin/infracost
- run: |
    infracost breakdown \
      --path plan.json \
      --format json \
      --out-file infracost.json
- run: |
    infracost comment github \
      --path infracost.json \
      --repo "$GITHUB_REPOSITORY" \
      --pull-request "$PR_NUMBER" \
      --github-token "$GITHUB_TOKEN"

В PR появляется комментарий с табличкой «было/будет/дельта».

API-токен или self-hosted

Infracost CLI без токена не работает, pricing-данные тянутся из Infracost Cloud API.

Регистрация бесплатна на infracost.io. Токен ставится:

bash
infracost configure set api_key INFRACOST_API_KEY

Self-hosted альтернатива, infracost-api, развёртываемый в твоей инфре. Pricing-данные обновляются вручную (download'ом snapshot'а). Опция для air-gapped или corporate-policy.

Полностью без сетевой связи, можно с pinned snapshot:

bash
infracost breakdown \
  --path plan.json \
  --usage-file infracost-usage.yml \
  --no-color

Бюджет-gate в CI

Самое мощное использование, fail PR'а если стоимость растёт больше N%:

bash
infracost diff \
  --path plan.json \
  --compare-to infracost-base.json \
  --format json \
  --out-file diff.json
PCT=$(jq '.diffTotalMonthlyCost / .pastTotalMonthlyCost * 100' diff.json)
if (( $(echo "$PCT > 20" | bc -l) )); then
  echo "Cost increase > 20%, fail"
  exit 1
fi

В реальной команде, обычно 10-20% threshold для warning, 50%+ для hard-fail. Конкретно настраивается по бизнес-приоритетам.

usage-file для accurate estimates

Infracost не угадывает usage-driven costs (S3 traffic, Lambda invocations). Если хочешь точно, infracost-usage.yml:

yaml
version: 0.1
resource_usage:
  aws_lambda_function.demo:
    monthly_requests: 1000000
    request_duration_ms: 300
  aws_s3_bucket.logs:
    standard_storage_gb: 500
    monthly_tier_1_requests: 100000
    monthly_data_returned_gb: 50

Без usage-file Infracost считает только fixed-cost; с ним, picture полнее.

Подводные камни

  • Pricing, оценочный. AWS-сервисы имеют tier'ы, regional discounts, Saving Plans. Infracost показывает on-demand list-price без savings. Real bill часто меньше.

  • Не считает sav plans, reservations, RIs. Если у тебя pre-paid commitment, Infracost не знает; реальная стоимость скорее меньше его estimate.

  • Some resources не поддерживаются. Edge-сервисы (новые продукты, специфические regions), Infracost-pricing'а может не быть. Resource видно в diff как «cost: unknown».

  • Threshold, политика, не инструмент. Гать «PR ≤ +20%» работает, пока команда придерживается. Если все начнут «approve override» , потеряет смысл.

  • Self-hosted API не показывает realtime-цены. Snapshot обновляется раз в N дней. Запоздалое отражение AWS pricing change'й.

  • GitHub-комментарии накапливаются. На каждом push в PR Infracost может оставить новый комментарий. Используй --behavior update (по дефолту), апдейтит существующий.

  • CI секрет. Infracost API-токен, пиннеси в repo-secrets, не в HCL. По дефолту через INFRACOST_API_KEY env.

§ команды

bash
infracost configure set api_key KEY

Записать токен один раз в ~/.config/infracost/credentials.yml.

bash
infracost breakdown --path .

Оценка на текущем HCL.

bash
infracost breakdown --path plan.json

Оценка из plan-файла, точнее.

bash
infracost diff --path . --compare-to base.json

Дельта PR-стоимости к baseline.

bash
infracost comment github --path infracost.json --repo X/Y --pull-request 42 --github-token TOK

Постит / обновляет PR-комментарий с табличкой стоимости.

§ см. также

  • tf-plan-apply-ciPlan-as-artifact и automation mode в CIВ CI plan-job создаёт `plan.tfplan`, грузит как артефакт. Apply-job скачивает артефакт и применяет ровно его, никакого нового plan на apply-стадии. Это гарантирует: то что показали reviewer'у в PR ровно то, что применилось. Все команды с `-input=false`, `-no-color`, `-lock-timeout` чтобы автоматизация не зависала. Plan-файл содержит sensitive, обращайся с ним как с секретом.
  • tf-policy-as-codeOPA + Rego, policy as code для Terraform planPolicy-as-code = правила («все S3 шифрованы», «никаких IAM с *») написаны кодом, гонятся в CI, fail'ят PR. OPA, стандарт, Rego, язык. conftest, обёртка с CLI-friendly выводом; читает plan.json, прогоняет правила, exit 0/1. Зрелее и дороже на старте, чем Checkov, но позволяет cross-resource правила любой сложности.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки