Короткий ответ
Нужно задать в объявлении переменной блок validation с условием (condition) и понятным сообщением об ошибке (error_message), а также по возможности ограничить тип через type (например, number, string) — тогда при передаче недопустимого значения Terraform остановится с явной ошибкой ещё до обращения к provider, а не при apply с малопонятным сообщением от API.
Как это работает подробнее
блок validation выполняется Terraform локально на этапе обработки конфигурации (во время plan/apply, до построения графа ресурсов), вычисляя булево выражение condition для значения переменной; если оно ложно, Terraform прерывает выполнение с заданным error_message, что происходит гораздо раньше и понятнее, чем ошибка от облачного провайдера при попытке создать ресурс с недопустимым параметром.
Пример кода
variable "instance_count" {
type = number
validation {
condition = var.instance_count >= 1 && var.instance_count <= 10
error_message = "instance_count должен быть от 1 до 10."
}
}
variable "environment" {
type = string
validation {
condition = contains(["dev", "staging", "prod"], var.environment)
error_message = "environment должен быть одним из: dev, staging, prod."
}
}Что использовать на практике
- Практика. стоит добавлять валидацию для всех переменных, значения которых ограничены бизнес-правилами или возможностями провайдера (диапазоны, допустимые enum-строки, формат CIDR и т.п.), а также писать
error_messageтак, чтобы разработчик сразу понимал, что и как исправить; для модулей, используемых несколькими командами, это существенно снижает число обращений в поддержку из-за непонятных ошибок API.
Подводные камни
- Ошибка. частая ошибка — полагаться только на тип переменной (
type = string) и не добавлятьvalidation, из-за чего опечатка типаenvironmant = "prod"в значении (а не в имени) незаметно создаёт ресурсы в несуществующем окружении или с дефолтным поведением; другая ошибка — писатьerror_messageбез указания, какое значение на самом деле ожидается, что не помогает диагностике.