Terraform: Ограничения типа для локальных переменных

#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 возвращалась бы ошибка.