Внутри блока конфигурации в Terraform пропуск необязательного аргумента и установка этого аргумента в null
эквивалентны. Поскольку access
является вложенным блоком, мы можем использовать его для написания выражений, которые условно устанавливают аргумент.
dynamic "access" {
# get accesses (list of dictionaries) from a file
for_each = [for a in jsondecode(file("$config.meta"))["access"]: {
role = a.role
special_group = try(a.special_group, null)
group_by_email = try(a.group_by_email, null)
}]
content {
role = access.value.role
special_group = access.value.special_group
group_by_email = access.value.group_by_email
}
}
Сначала используется функция try
, чтобы отсутствующий атрибут приведет к снижению значения null
, а не к ошибке. Это означает, что результирующие объекты будут выглядеть примерно так:
[
{
"role": "OWNER",
"special_group": "projectOwners",
"group_by_name": null,
},
{
"role": "READER",
"special_group": null,
"group_by_email": "myemail@myemail.com",
},
]
Внутри блока content
мы просто назначим все эти объекты напрямую. Те, которые null
будут обрабатываться Terraform, как будто они вообще не установлены, из-за поведения, которое я описал ранее. (Обратите внимание, что поведение при обработке значения null
как неустановленного не применяется при построении значений объекта: это специальное поведение только для прямых аргументов внутри блока.)
Это должно иметь такой же эффект, как если бы вы бы выписали следующие два access
блока напрямую:
access {
role = "OWNER"
special_group = "projectOwners"
}
access {
role = "READER"
group_by_email = "myemail@myemail.com"
}