При работе с Terraform мы часто хотим перефразировать проблемы, связанные с условным тестом, в проблемы, связанные с коллекцией, которая может содержать или не содержать элементы, потому что возможности языка Terraform ориентированы на преобразование коллекций в конфигурацию поэлементно. .
В вашем случае у вас есть переменная, которая уже является списком, поэтому она может просто гарантировать, что ее значением по умолчанию является пустой список, а не null
, и, таким образом, вы можете просто сгенерировать один waf_configuration
блок на элемент:
variable "waf_configuration" {
type = list(object({
enabled = bool
firewall_mode = string
}))
default = []
}
Затем вы можете использовать dynamic
block для генерации одного waf_configuration
блока на элемент этого списка:
dynamic "waf_configuration" {
for_each = var.waf_configuration
content {
enabled = waf_configuration.value.enabled
firewall_mode = waf_configuration.value.firewall_mode
}
}
Хотя это, кажется, не относится к этому конкретному примеру, другой распространенный шаблон - это переменная, которая может быть установлена для включения чего-либо или оставлена неустановленной для ее отключения. Например, если ваш модуль предназначен для использования только одиночной необязательной конфигурации WAF, вы можете определить переменную следующим образом:
variable "waf_configuration" {
type = object({
enabled = bool
firewall_mode = string
})
default = null
}
Как отмечалось выше, лучший способ работы с что-то подобное в Terraform - это преобразовать его в список, который может быть пустым. Поскольку это обычная ситуация, для нее есть сокращение с помощью выражений сплат :
dynamic "waf_configuration" {
for_each = var.waf_configuration[*]
content {
enabled = waf_configuration.value.enabled
firewall_mode = waf_configuration.value.firewall_mode
}
}
Когда мы применяем оператор [*]
к значению, не относящемуся к списку / не установленный тип, Terraform проверит, является ли значение null
. Если равно null, то результатом будет пустой список, а если не null, то результатом будет одноэлементный список, содержащий это одно значение.
После преобразования в список мы можем использовать его в аргументе for_each
в dynamic
обычным способом, получая доступ к атрибутам из этого возможного единственного элемента внутри блока content
. Нам не нужно повторять условные выражения для каждого аргумента, поскольку содержимое блока content
оценивается только тогда, когда список не пуст.