Как разрешить упорядоченный список в пользовательском ресурсе поставщика терраформ?
У меня есть настраиваемый поставщик терраформ с ресурсом, который принимает список в качестве одного из входов. Когда я объявляю список, он должен быть задан как несколько блоков, как показано ниже:
policies {
rules {
name = "foobar"
v = "shared"
}
rules {
name = "batz"
v = "shared"
}
}
Вместо этого я хочу иметь возможность объявить это следующим образом:
policies {
rules = [
{
name = "foobar"
v = "shared"
},
{
name = "batz"
v = "shared"
}
]
}
Это вызывает следующую ошибку:
Error: Unsupported argument
on main.tf line 79, in resource "myresource" "sp":
79: rules = [
An argument named "rules" is not expected here. Did you mean to define a block
of type "rules"?
Почему я не могу использовать упорядоченный список и как разрешить его использование?
1 ответ
Используемый вами Terraform SDK изначально был разработан для Terraform v0.11 и более ранних версий, поэтому он не поддерживает конструкции конфигурации, которые не поддерживали эти более ранние версии Terraform, а Terraform v0.11 и более ранние версии не поддерживали списки объектов в так, как вы собираетесь здесь.
Чтобы использовать все возможности современного языка Terraform, вы можете вместо этого создать свой провайдер с более новой Plugin Framework, которая разработана на основе современной системы языковых типов Terraform, хотя в настоящее время она также менее зрелая, чем более старый SDK из-за разницы в возрасте. .
В новой структуре вы можете объявитьtfsdk.Attribute
который имеет
Attributes
поле установлено вtfsdk.ListNestedAttributes
результат:
tfsdk.Attribute{
Attributes: tfsdk.ListNestedAttributes(
map[string]tfsdk.Attribute{
"name": tfsdk.Attribute{
// ...
},
"namespace": tfsdk.Attribute{
// ...
},
},
tfsdk.ListNestedAttributesOptions{},
),
// ...
}
В приведенном выше (частичном) примере объявляется атрибут, который ожидает список объектов, где каждый объект может иметь
name
а также
namespace
атрибутирует себя.
Самое близкое к этому в старом SDK — это последовательность блоков, показанная в вашем примере. В более старых провайдерах, созданных с помощью этого SDK, общим шаблоном здесь было бы присвоение блоку имени в единственном числе.
policy
, а не во множественном числе
policies
, чтобы в конфигурации было понятнее, что каждый блок объявляет только одну политику в последовательности.