Если вы когда-либо развертывали модуль Terraform и столкнулись с ситуацией, когда вместо открытой подсети был передан ID закрытой подсети, то знаете, какова это боль. Развертывание проходит без ошибок, но ничего не работает. Вы тратите 30 минут на отладку, пока не понимаете, что проблема в неверном вводе. Terraform имеет инструменты для предотвращения таких моментов, но они часто остаются незамеченными.
Тишина и ошибки конфигурации
Рассмотрим простой модуль NAT Gateway: он принимает любой ID подсети, не проверяя, является ли он публичным. Terraform не выдаст никаких предупреждений, и AWS тоже — по крайней мере, до тех пор, пока ваши закрытые подсети не потеряют доступ к интернету, а вы не начнете искать причину сбоя.
Как исправить ситуацию?
С введением версии Terraform 1.0 появилась возможность добавлять блоки валидации в переменные. Например:
variable "public_subnet_ids" {
description = "ID публичных подсетей для размещения NAT Gateway"
type = list(string)
validation {
condition = length(var.public_subnet_ids) > 0
error_message = "Необходимо указать хотя бы один публичный ID подсети."
}
validation {
condition = alltrue([for id in var.public_subnet_ids : startswith(id, "subnet-")])
error_message = "Все значения должны быть действительными ID подсетей (начинающимся с 'subnet-')."
}
}
Теперь команда terraform plan завершится с четким сообщением, если передан пустой список или некорректные значения. Также можно использовать блоки предварительных условий для валидации связей между переменными.
Зачем это нужно?
Каждая добавленная валидация — это один меньше поддерживающий билет, меньше вопросов в Slack и меньше времени, потраченного на очевидные конфигурационные ошибки. Все эти проверки выполняются во время terraform plan — это нулевые затраты и риск. Просто получите более быструю обратную связь.
Те, кто разрабатывает модули Terraform для AWS, могут обратить внимание на коллекцию модулей HAIT на Terraform Registry, чтобы получить готовые решения и повысить свою продуктивность.
Что дальше?
Применяйте валидации в своих Terraform модулях, чтобы избежать недоразумений и упростить процесс развертывания.


