DRY с Terragrunt
Тема дорожной карты · Terraform
Принцип DRY (Don't Repeat Yourself — «Не повторяйся») в Terraform направляет инженеров устранять дублирование HCL-кода путём выноса повторяющихся паттернов в версионированные модули, вычисляемые значения locals и циклы ресурсов на основе for_each, а не копирования блоков ресурсов между окружениями или проектами. На практике применение принципа DRY в Terraform означает, что различия между окружениями — размеры инстансов, количество реплик, CIDR-диапазоны — хранятся исключительно в tfvars-файлах, тогда как HCL-источник модуля остаётся единственным каноническим определением, вызываемым с разными входными данными корневыми модулями dev, staging и production. Принцип DRY в Terraform также не рекомендует хардкодить значения, специфичные для провайдера (AWS AMI ID, Azure VM SKU, типы машин GCP), непосредственно в блоках resource; вместо этого источники данных data или карты variable разрешают их динамически, чтобы terraform plan всегда оценивал против актуального каталога провайдера. Инструменты tflint и terraform-docs применяют DRY на уровне линтинга, помечая устаревшие аргументы ресурсов и отсутствующую документацию модулей, тогда как Terratest валидирует, что DRY-модули действительно производят ожидаемые выходные данные для всех потребителей. Последовательное применение принципа DRY в Terraform сокращает поверхность ошибок terraform apply, уменьшает diff в выводе terraform plan и делает обновления версий модулей целенаправленными, малорискованными операциями.
Как это работает
DRY с Terragrunt покрывает 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.
Типичные ошибки
Ловушки DRY с Terragrunt: lifecycle-блоки прячут реальный drift (не видите изменение, потому что игнорите); циклический depends_on; злоупотребление null_resource для "выполнить скрипт" (реальные provisioner — осторожно, или вынесите логику вне Terraform); глубоко вложенные dynamic-блоки, нечитаемые через 3 месяца.