Monorepo для IaC
Тема дорожной карты · Terraform
Паттерн монорепозитория Terraform объединяет все IaC-конфигурации — модули, корневые стеки, среда-специфичные tfvars и определения CI/CD-рабочих процессов — в единый Git-репозиторий, предоставляя командам платформы централизованное место для управления инфраструктурой AWS, Azure, GCP, Kubernetes и других провайдеров при сохранении единообразия инструментов и процессов ревью. В монорепозитории Terraform переиспользуемые модули хранятся в директории modules/, корневые модули окружений — в environments/<env>/ или stacks/<service>/, а Atlantis или GitHub Actions обнаруживает, какие воркспейсы Terraform затронуты изменёнными файлами PR, запуская только соответствующие terraform plan, а не планируя весь репозиторий. Паттерн монорепозитория Terraform централизует управление зависимостями: один файл versions.tf или верхнеуровневый .terraform-version (для tfenv) фиксирует версию бинарника Terraform или OpenTofu для всех стеков, а ограничения version модулей в блоках module обновляются в одном месте и валидируются PR-обновлениями Renovate или Dependabot. Подход монорепозитория упрощает управление секретами — SOPS-зашифрованные tfvars, учётные данные Vault AppRole и конфигурации OIDC ограничены секретами CI/CD одного репозитория — и позволяет запускать сканирования tflint и Checkov в масштабе как единый CI-джоб по всем изменённым путям. Основной компромисс паттерна монорепозитория Terraform по сравнению с подходом нескольких репозиториев — детализация контроля доступа: файлы CODEOWNERS и правила защиты веток смягчают это, ограничивая круг лиц, имеющих право подтверждать изменения в конкретных директориях окружений.
Как это работает
Monorepo для IaC покрывает for_each с map для стабильной идентичности, dynamic-блоки для повторяющегося nested-конфига, lifecycle { create_before_destroy = true / prevent_destroy / ignore_changes }, depends_on для явного порядка, terraform_data (замена null_resource), replace_triggered_by. Главный паттерн power-user — композиция модулей: маленькие сфокусированные модули + тонкий root-конфиг, их связывающий. Не злоупотребляйте meta-аргументами — они стоят читаемости.
Когда применять
create_before_destroy — для ресурсов, которые не можете позволить себе быть down (load balancer, DNS-записи). prevent_destroy — на БД (terraform destroy не должен случайно удалить prod-данные — сделайте шумно). ignore_changes — только для полей, управляемых вне Terraform (auto-scaling desired_capacity — классика). Для сложных flow — генерируйте Terraform через CDK for Terraform (CDKTF) вместо хака HCL.
Типичные ошибки
Ловушки Monorepo для IaC: lifecycle-блоки прячут реальный drift (не видите изменение, потому что игнорите); циклический depends_on; злоупотребление null_resource для "выполнить скрипт" (реальные provisioner — осторожно, или вынесите логику вне Terraform); глубоко вложенные dynamic-блоки, нечитаемые через 3 месяца.