kb/advanced
Terragrunt и CDKTF, обёртки и альтернативные frontend'ы для Terraform. Custom-provider на Plugin Framework, внутренности DAG-планировщика, иерархия state'ов на сотнях ресурсов, blue-green миграция legacy-инфры, Infracost, OpenTofu в матрице CI, и список тем где Terraform, не тот инструмент.
Когда legacy-инфра (ClickOps в Console, CloudFormation, Ansible) большая, `terraform import` каждого ресурса, недели работы и риски. Альтернатива: blue-green, поднимаешь параллельную копию через Terraform (green), переключаешь traffic, сносишь legacy (blue). Дороже по cloud-bill (двойная инфра несколько дней), но безопаснее: можешь откатиться, никакого destructive-import'а.
CDKTF, Terraform на TypeScript/Python/Go/Java/C#. На выходе стандартный HCL + tfstate. Плюсы: типы, autocomplete, циклы и классы. Минусы: ещё одна абстракция, debug сложнее, не все фичи Terraform покрыты 1:1. Оправдан когда нужна программируемая генерация HCL (N stack'ов из CSV, например).
Terraform строит DAG (directed acyclic graph) из ресурсов и их зависимостей. На plan/apply граф «обходится» в топологическом порядке, параллельно где можно (limit, `-parallelism`, дефолт 10). Implicit dependencies, через interpolation; explicit, `depends_on`. Цикл = `Cycle: ...` ошибка. Понимание DAG объясняет почему apply иногда «застревает» и как ускорить большой граф.
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.
В 2023 HashiCorp перевела Terraform на BSL, community форкнула под именем OpenTofu (Linux Foundation). API совместим, HCL тот же, провайдеры те же. Расхождение пошло: OpenTofu добавил state-encryption, `exclude` для for_each; Terraform, Stacks. Matrix-CI: гонять оба, ловить расхождение фич.
Terraform Stacks, фича HCP Terraform (2024), частично закрывает то что делал Terragrunt. Один stack = множество components, между ними явные dependencies, deployment с разными inputs делает развёртывание N сред из одной конфигурации. Сейчас Cloud-only (HCP Terraform), open-source CLI, в работе. Кому нужно сегодня: либо HCP Terraform, либо ждать, либо использовать Terragrunt.
Terragrunt, обёртка Gruntwork, решает проблему «directory-per-env» дублирования. Объявляешь `terragrunt.hcl` с `inputs` и `include`'ами; Terragrunt генерирует backend.tf, provider.tf и main.tf на лету и вызывает `terraform`. Альтернатива, workspaces (опасно), copy-paste (плохо), CDKTF (другой стек). Стоимость, ещё один tool в цепочке, ещё один HCL-диалект.
Один state на 5000 ресурсов = боль: refresh минуты, lock-contention, любой apply трогает всё. Решение, иерархия state'ов: network/iam отдельно, apps отдельно, между ними `terraform_remote_state`. Blast-radius, критерий разделения. Naming для бакетов и lock-таблиц предсказуемая структура.
Свой provider, Go через terraform-plugin-framework. Модель: Provider → Resource (CRUD) или DataSource (R). Каждый ресурс, Schema + методы Create/Read/Update/Delete. Core общается с provider по gRPC. Деплой: `go install` + dev_overrides, или Terraform Registry. Нужен когда нет готового provider для твоего API.