Inputs и outputs

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

Входные и выходные данные модулей Terraform — это формальный интерфейс модуля: блоки variable определяют, какие значения вызывающая конфигурация должна или может передать, а блоки output предоставляют атрибуты ресурсов, производимые модулем для использования родительской конфигурацией или другими модулями. Входные данные модуля Terraform объявляются блоками variable, задающими type, необязательный default, description и правила validation — например, variable "instance_type" { type = string; default = "t3.micro" } позволяет вызывающей стороне переопределить тип инстанса AWS через tfvars, не изменяя источник модуля. Выходные данные модулей Terraform объявляются блоками output и ссылаются родителем как module.<name>.<output_name> — модуль VPC может выдавать vpc_id, public_subnet_ids и private_subnet_ids, которые нижестоящий модуль EKS или GCP GKE потребляет как входные данные без доступа к state-файлу дочернего модуля. Проектирование чистых входных и выходных данных модулей Terraform означает пометку чувствительных значений (sensitive = true), предоставление подробных описаний (используемых генератором документации Terraform Registry) и избегание утечки внутренних ссылок на ресурсы, создающих тесную связность между версиями модулей. Хорошо спроектированные интерфейсы модулей позволяют terraform plan точно моделировать граф зависимостей, обеспечивают безопасные обновления версий с ограничениями семантического версионирования и поддерживают приёмочные тесты Terratest, валидирующие полный контракт ввода-вывода модуля.

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

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

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

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

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

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