Модули

Тема дорожной карты · Terraform

Модули Terraform — это самодостаточные пакеты конфигурации Terraform или OpenTofu, объединяющие связанные ресурсы в переиспользуемую единицу, позволяя командам абстрагировать инфраструктурные паттерны — например, AWS VPC с подсетями и таблицами маршрутизации, кластер Azure AKS или инстанс GCP Cloud SQL — и делиться ими между несколькими окружениями и проектами. Модуль Terraform — это просто директория, содержащая .tf-файлы; технически любая конфигурация является модулем, но термин чаще всего относится к дочерним модулям, вызываемым из корневого модуля блоком module, указывающим source (локальный путь, Git URL или адрес Terraform Registry) и необходимые значения входных variable. Модули Terraform продвигают принцип DRY, устраняя копирование инфраструктурного кода: вместо повторения 200 строк HCL для каждого окружения корневой модуль вызывает один и тот же версионированный дочерний модуль с разными tfvars, и terraform apply создаёт идентичные, но независимо управляемые стеки инфраструктуры. Модули инкапсулируют внутренние детали реализации — locals, вспомогательные ресурсы и источники данных data — за чистым интерфейсом входных variable и выходных output, чтобы потребители могли обновлять версии модулей, не разбираясь в деталях провайдера. Тестирование модулей Terraform с помощью Terratest, написание проверок terraform validate в GitHub Actions или GitLab CI и публикация протестированных версий в Terraform Registry или приватный реестр Terraform Cloud — признаки зрелой практики платформенной инженерии IaC.

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

Модули инкапсулируют переиспользуемые инфра-паттерны. Модуль — это просто директория с *.tf; root-модуль зовёт child-модули module "name" { source = "./path" или "tfregistry/..." или "git::..." }. Входы — variable-блоки; выходы — output-блоки. Публичные модули — на Terraform Registry (registry.terraform.io); приватные — в git, S3, приватном registry. Пинните версии модулей (version = "1.2.3" или git-тег).

Когда применять

Модули — для любого инфра-паттерна, построенного больше одного раза ("сервис с ALB + ASG + RDS"). Публичные модули с Registry — для известных паттернов (VPC, k8s-кластер); экономят недели. Модули маленькие и сфокусированные; "один большой модуль на всё" хуже плоского root-конфига. Всегда версионируйте модули git-тегами + semver.

Типичные ошибки

Ловушки Модули: глубоко вложенные цепочки модулей (root → A → B → C → D) — отладка боль, terraform graph помогает; модули с 30+ входными переменными (переинжинирен — разделите или примите разумные дефолты); модуль без поддержки (читайте его issues + commits перед принятием); не запиннена версия (source = "..../tags/main" сломается случайно).

Связанные понятия

Полезные ресурсы