Композиция модулей

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

Компоновка модулей Terraform — это архитектурная техника создания сложной инфраструктуры путём соединения нескольких узкоспециализированных модулей с одной ответственностью, а не написания монолитной конфигурации, чтобы каждый модуль управлял небольшим набором ресурсов AWS, Azure, GCP или Kubernetes и предоставлял только те входные и выходные данные, которые нужны его потребителям. При компоновке модулей Terraform корневой модуль (конфигурация, где выполняется terraform apply) вызывает дочерние модули для сетей, вычислений, баз данных и IAM, передавая выходные данные одного модуля как входные данные другого: например, module.vpc.subnet_ids передаётся в module.eks.subnet_ids без совместного использования state-файлов ни одним из модулей. Этот композиционный подход непосредственно реализует принцип разделения ответственности и паттерн DRY: общие инфраструктурные примитивы — создание S3-бакетов, правила групп безопасности, прикрепление Vault-политик — хранятся в версионированных модулях из Terraform Registry или приватного Git-репозитория, а корневые модули просто компонуют их с среда-специфичными tfvars. Компоновка модулей Terraform также поддерживает параллельные рабочие процессы команд: команда сетей публикует модуль VPC, команда платформы публикует модуль Kubernetes, а команды приложений компонуют оба в своей корневой конфигурации, не разбираясь во внутренностях ни одного из них. Тестирование скомпонованных графов модулей с помощью Terratest или terraform plan в CI/CD-конвейере (GitHub Actions, GitLab CI, Atlantis) валидирует связку до того, как terraform apply достигнет production.

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

Композиция модулей инкапсулируют переиспользуемые инфра-паттерны. Модуль — это просто директория с *.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" сломается случайно).

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

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