Terraform — Проверка Карты Объектов

  • Автор темы Beagelv
  • Обновлено
  • 20, Oct 2024
  • #1

Я пытаюсь проверить карту объектов, которая напечатана, как показано ниже:

 
 
 
 
 for_each 

Значение переменной выглядит так:

The condition for variable "ecs_config_map" can only refer to the variable itself, using var.ecs_config_map.

Теперь я хочу выполнить базовую проверку, но, похоже, не могу правильно понять синтаксис.

validation { condition = can(for task in var.ecs_config_map : contains(["EC2", "FARGATE", "EXTERNAL"], task["launch_type"])) error_message = "Only EC2, FARGATE, EXTERNAL are allowed values for launch_type." }

Это бросило for


Отладка включена var.ecs_config_map[*] described :

> type(var.ecs_config_map) map( object({ capabilities: list(string), cpu: number, desired: number, launch_type: string, memory: number, }), ) > type(var.ecs_config_map["driver"]) object({ capabilities: list(string), cpu: number, desired: number, launch_type: string, memory: number, }) > type(var.ecs_config_map[*]) tuple([ map( object({ capabilities: list(string), cpu: number, desired: number, launch_type: string, memory: number, }), ), ])

что указывало на то, что моя проблема заключалась в том, что я пытался перебрать все объекты в переменной. Я использую выражение знака при выполнении terraform console which converts the whole map into a tuple of maps of objects.


Затем я попытался использовать Invalid value for "list" parameter: list of bool required. expression to perform the validation

validation { condition = contains(["EC2", "FARGATE", "EXTERNAL"], var.ecs_config_map[*]["launch_type"]) error_message = "Only EC2, FARGATE, EXTERNAL are allowed values for launch_type." }

И меня бросили ecs_config_map = { driver = { cpu = 256 memory = 512 desired = 0 capabilities = ["FARGATE"] launch_type = "FARGATE" } aggregator = { cpu = 256 memory = 512 desired = 0 capabilities = ["FARGATE"] launch_type = "FARGATE" } }

variable "ecs_config_map" { type = map(object({ cpu = number memory = number desired = number capabilities = list(string) launch_type = string })) } did not work either.


Я где-то испортил синтаксис проверки? Или я требую слишком многого от terraform, пытаясь проверить сложный тип?

#терраформировать

Beagelv


Рег
03 Sep, 2019

Тем
84

Постов
197

Баллов
657
  • 25, Oct 2024
  • #2

Вы можете проверить свою переменную с помощью следующего выражения:

 
 
 
 0 

Это может показаться сложным, поэтому давайте разберемся.

Мы можем извлечь типы запуска из length with the following output "not_allowed_launch_types" { value = [for launch_type in values(var.ecs_config_map)[*].launch_type: launch_type if !contains(["EC2", "FARGATE", "EXTERNAL"], launch_type)] } выражение:

["EC2", "FARGATE", "EXTERNAL"]

Результатом этого будет что-то вроде:

launch_types = [ "FARGATE", "FARGATE", ]

Двигаясь дальше, мы хотели бы отфильтровать те типы запуска, которых нет в массиве разрешенных типов ( output "launch_types" { value = [for launch_type in values(var.ecs_config_map)[*].launch_type : launch_type] } ). We can do this as such:

for

Если ввод верен, на выходе должен появиться пустой массив, иначе на выходе мы получим неправильные типы запуска.

Последний шаг — проверить, есть ли у нас неправильные типы запуска. Мы можем сделать это с помощью ecs_config_map function, if the length of the array with the incorrect launch types is greater than validation { condition = length([for launch_type in values(var.ecs_config_map)[*].launch_type: launch_type if !contains(["EC2", "FARGATE", "EXTERNAL"], launch_type)]) <= 0 error_message = "Only EC2, FARGATE, EXTERNAL are allowed values for launch_type." } , у нас неверный ввод.

 

Mappers


Рег
28 Oct, 2008

Тем
57

Постов
181

Баллов
506
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно