Что 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
Запуск
# на 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'ом (предыдущим состоянием):
# сохранить 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:
- 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. Токен ставится:
infracost configure set api_key INFRACOST_API_KEY
Self-hosted альтернатива, infracost-api, развёртываемый в твоей
инфре. Pricing-данные обновляются вручную (download'ом snapshot'а).
Опция для air-gapped или corporate-policy.
Полностью без сетевой связи, можно с pinned snapshot:
infracost breakdown \
--path plan.json \
--usage-file infracost-usage.yml \
--no-color
Бюджет-gate в CI
Самое мощное использование, fail PR'а если стоимость растёт больше N%:
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:
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_KEYenv.