# Infracost, оценка стоимости плана _Advanced · TerraformLab Knowledge Base_ **TL;DR:** 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. ## Что 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-комментарий с табличкой стоимости. ## См. также - [Plan-as-artifact и automation mode в CI](/terraform/kb/tf-plan-apply-ci.md) - [OPA + Rego, policy as code для Terraform plan](/terraform/kb/tf-policy-as-code.md)