#types #terraform
Вопрос:
Я знаю, что в Terraform мы можем определять переменные и присваивать им такие типы
variable "foo" {
type= string
default= "foo"
}
также можно определить местных жителей, таких как
locals {
foo = {
a = "foo"
b = "bar"
}
}
То, что я хочу, — это сочетание того и другого, если это возможно. Итак, есть ли способ наложить ограничения типа на локальные переменные без необходимости определять соответствующий файл переменных?? Итак, другими словами, могу ли я получить что-то вроде
locals {
a = map(string)
a = {
foo = string,
foo = "foo"
}
}
Это просто фиктивное определение, чтобы продемонстрировать, что я ищу
Ответ №1:
У меня был сценарий, в котором мне пришлось наложить ограничение на var, вот что у меня получилось, не будет работать для местных жителей:
variable "test_vars" {
type = list(object({
feature_flag = bool
value = string
}))
default = [
{
feature_flag = 9
value = "WORLD"
}]
}
output "test" {
value = var.test_vars
}
Это выдаст ошибку:
This default value is not compatible with the variable's type constraint: element 0: attribute "feature_flag": bool required.
Ответ №2:
В Terraform нет синтаксиса для прямой записи ограничения типа для локального значения; тип всегда выводится из результата выражения.
Однако, если вы хотите, чтобы это значение было конкретно отображением строки, а не object({ a = string, b = string })
как по умолчанию предполагает Terraform, вы можете преобразовать это значение в карту с помощью tomap
функции:
locals {
foo = tomap({
a = "foo"
b = "bar"
})
}
tomap
Функция заметит, что все типы атрибутов являются string
таковыми, и, таким образом, выдаст map(string)
значение в качестве своего результата.
Если бы не было какого-либо одного типа, в который могли бы быть преобразованы все значения элементов (как требуется для типа карты в Terraform), то tomap
возвращалась бы ошибка.