Skip to content

Оценка стоимости

TerraCi умеет оценивать месячную стоимость инфраструктуры на основе Terraform планов, используя данные AWS Pricing API. Это позволяет видеть финансовое влияние каждого изменения прямо в комментарии к Merge Request.

Базовая конфигурация

yaml
extensions:
  cost:
    providers:
      aws:
        enabled: true

Это минимальный конфиг для активации. Кеш цен инициализируется автоматически через бэкенд diskblob в сервисной директории проекта.

Параметры конфигурации

providers.aws.enabled

Активирует AWS-оценку. Плагин использует политику EnabledExplicitly: cost запускается только если хотя бы у одного провайдера enabled: true.

yaml
extensions:
  cost:
    providers:
      aws:
        enabled: true

blob_cache

Данные о ценах кешируются через blob-store (diskblob по умолчанию). Переопределите бэкенд, namespace или TTL:

yaml
extensions:
  cost:
    blob_cache:
      backend: diskblob       # по умолчанию; любой зарегистрированный BlobStoreProvider
      namespace: cost/pricing # по умолчанию
      ttl: "24h"              # по умолчанию

ttl принимает строки формата Go-duration: "1h", "30m", "72h". Бэкенд diskblob хранит объекты в ~/.terraci/blobs/ по умолчанию — см. конфиг плагина diskblob, чтобы переопределить.

Удалённые поля

Ранее принимались cost.cache_dir и cost.cache_ttl на верхнем уровне cost. Оба поля удалены: cache_dir отвергается на валидации, а cache_ttl переехал в blob_cache.ttl.

Как это работает

  1. Парсится plan.json (результат terraform show -json) для каждого модуля
  2. Определяются изменения ресурсов (create, update, delete, replace)
  3. Каждый тип ресурса сопоставляется с обработчиком из реестра aws.Registry
  4. Цены загружаются из AWS Bulk Pricing API и кешируются через настроенный blob_cache
  5. Рассчитывается часовая и месячная стоимость каждого ресурса
  6. Результат агрегируется в стоимость модуля с показателями before/after/diff

При наличии state.json в директории модуля учитываются также неизменяемые ресурсы для полной картины стоимости.

Поддерживаемые ресурсы AWS

Вычислительные ресурсы

Terraform ресурсОписание
aws_instanceEC2 инстансы
aws_ebs_volumeEBS тома
aws_eipElastic IP адреса
aws_nat_gatewayNAT Gateway

Базы данных

Terraform ресурсОписание
aws_db_instanceRDS инстансы
aws_rds_clusterRDS кластеры (Aurora)
aws_rds_cluster_instanceИнстансы кластеров RDS

Балансировка нагрузки

Terraform ресурсОписание
aws_lb / aws_albApplication Load Balancer
aws_elbClassic Load Balancer

Кеширование

Terraform ресурсОписание
aws_elasticache_clusterElastiCache кластеры
aws_elasticache_replication_groupElastiCache группы репликации

Kubernetes

Terraform ресурсОписание
aws_eks_clusterEKS кластеры
aws_eks_node_groupEKS группы нод

Serverless и очереди

Terraform ресурсОписание
aws_lambda_functionLambda функции
aws_dynamodb_tableDynamoDB таблицы
aws_sqs_queueSQS очереди
aws_sns_topicSNS топики
aws_secretsmanager_secretSecrets Manager

Хранение и сеть

Terraform ресурсОписание
aws_s3_bucketS3 бакеты (только хранение)
aws_route53_zoneRoute 53 зоны

Мониторинг и безопасность

Terraform ресурсОписание
aws_cloudwatch_log_groupCloudWatch Log Groups
aws_cloudwatch_metric_alarmCloudWatch алармы
aws_kms_keyKMS ключи

TIP

Неподдерживаемые типы ресурсов не блокируют оценку -- они просто пропускаются. В отладочном режиме (-v) выводится информация о пропущенных ресурсах.

Интеграция с MR/PR

При включённом плагине cost оценки стоимости отображаются в таблице комментария MR/PR. Для каждого модуля показывается разница месячной стоимости:

markdown
| Модуль | Plan | Политики | Стоимость |
|--------|------|----------|-----------|
| platform/prod/eu-central-1/vpc | :white_check_mark: | :white_check_mark: | +$124.50/мес |
| platform/prod/eu-central-1/eks | :white_check_mark: | :white_check_mark: | +$1,280/мес |
| platform/prod/eu-central-1/rds | :warning: | :white_check_mark: | -$45.20/мес |

Кеширование цен

TerraCi загружает данные из AWS Bulk Pricing API и кеширует их локально. Это позволяет:

  • Избежать лишних запросов к AWS API при повторных запусках
  • Ускорить оценку стоимости в CI/CD пайплайнах
  • Работать оффлайн с уже загруженным кешем

Кеш организован по сервисам и регионам. При запуске TerraCi автоматически определяет, какие данные необходимы, и загружает только недостающие.

Полный пример конфигурации

yaml
execution:

extensions:
  cost:
    blob_cache:
      backend: diskblob
      namespace: cost/pricing
      ttl: "24h"
    providers:
      aws:
        enabled: true

  # MR/PR комментарии формирует summary.
  summary:
    enabled: true

Эта конфигурация включает оценку стоимости с кешированием по умолчанию и отображает результаты в комментариях MR/PR рядом с выводом plan.

CLI команда

Запуск оценки стоимости из командной строки:

bash
# Оценить все модули с plan.json
terraci cost

# Оценить один модуль
terraci cost --module platform/prod/eu-central-1/rds

# JSON вывод
terraci cost --output json

# Подробно — стоимость по ресурсам и информация о кеше
terraci cost -v

Команда terraci cost сканирует plan.json файлы, загружает данные о ценах и выводит оценку стоимости по модулям. В выводе показывается расположение кеша и время до его обновления.

В JSON выводе для каждого ресурса есть поле status:

  • exact, если TerraCi смог определить цену на этапе plan
  • usage_estimated, если TerraCi смог вывести частичную оценку из настроенной capacity
  • usage_unknown, если без runtime usage данных стоимость определить нельзя
  • unsupported / failed, если ресурс не поддержан или получение цены завершилось ошибкой

Примечание: требуется настройка extensions.cost в .terraci.yaml.

В CI пайплайнах оценка стоимости выполняется автоматически в рамках terraci summary. Используйте terraci cost для локальной разработки и проверки.

Примеры

См. examples/cost-estimation — рабочий пример с VPC, EKS и RDS модулями.

Смотрите также

Released under the MIT License.