Версионирование модулей

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

Версионирование модулей Terraform — это практика фиксации ссылок source модулей на конкретные ограничения семантических версий, чтобы terraform init загружал известную, протестированную версию модуля, а не молча загружал последний выпуск, способный внести критические изменения в инфраструктуру AWS, Azure, GCP или Kubernetes. В блоке module аргумент version принимает ограничения вида = 3.14.0 (точная фиксация), ~> 3.14 (допускаются патч-обновления) или >= 3.0, < 4.0 (диапазон минорных версий), давая командам контроль над тем, когда обновления модулей принимаются и проверяются. Версионирование модулей Terraform применимо в равной мере к модулям из публичного Terraform Registry, приватных реестров Terraform Cloud и Git URL — для Git-источников параметр запроса ?ref=v3.14.0 фиксирует точный тег, обеспечивая воспроизводимость в конвейерах GitHub Actions или GitLab CI. При выпуске автором новой версии потребители должны намеренно обновить ограничение version, запустить terraform init -upgrade для загрузки нового выпуска, проверить diff terraform plan на предмет неожиданных изменений и продвинуть обновление через цепочку dev → staging → production. Применение строгого версионирования модулей Terraform через правила tflint или автоматические PR обновления версий через Renovate/Dependabot делает зависимости 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" сломается случайно).

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

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