Карта переменных фильтрации список

#list #loops #dictionary #variables #terraform

Вопрос:

У меня есть структура данных, и мне нужно извлечь список из карты списков на основе ключа maps. Вот пример данных:

 locals {
  firwall_rules = ["first", "third"]   # this is the filter used on firewall_rules_lookup 
  firewall_rules_lookup = {
    type = map
    "first" = [ { name ="rule1.1", start_ip="0.0.0.1" , end_ip = "0.0.0.2" },
                { name ="rule1.2", start_ip="0.0.0.4" , end_ip = "0.0.0.5" },
              ],
 
    "second"= [ { name ="rule2.1", start_ip="0.0.1.1" , end_ip = "0.0.1.2" } ],
 
    "third" = [ { name ="rule3.1", start_ip="0.0.3.1" , end_ip = "0.0.3.2" },
                { name ="rule3.2", start_ip="0.0.3.4" , end_ip = "0.0.3.5" },
              ]
  }
  
  fw_rules = flatten([
    for rule_name in local.firewall_rules : {
      for r in local.firewall_rules_lookup[rule_name] : {
         name = r.name
         start_ip = r.start_ip
         end_ip = r.end_ip
      }
    }
  ])
}
 

Ожидаемый результат:

 fw_rules=
[ { name ="rule1.1", start_ip="0.0.0.1" , end_ip = "0.0.0.2" },
  { name ="rule1.2", start_ip="0.0.0.4" , end_ip = "0.0.0.5" },
  { name ="rule3.1", start_ip="0.0.3.1" , end_ip = "0.0.3.2" },
  { name ="rule3.2", start_ip="0.0.3.4" , end_ip = "0.0.3.5" }
]
 

Внутренний цикл for не работает. Терраформ выдает мне ошибку. Я думаю, что циклы for
работают только с картами. Есть ли другое решение этой проблемы?

Комментарии:

1. Без проблем. Если бы мой ответ был полезен, его принятие было бы оценено по достоинству.

2. Привет @Marcin, да, это сработало. Вчера опубликовал свой ответ. Не знаю, почему он исчез здесь.

3. Рад это слышать. Если бы мой ответ помог, вы могли бы принять его. Нет причин создавать для этого новый ответ.

Ответ №1:

Это должно быть следующим образом:

 locals {
  firewall_rules = ["first", "third"]   # this is the filter used on firewall_rules_lookup 
  firewall_rules_lookup = {
    "first" = [ { name ="rule1.1", start_ip="0.0.0.1" , end_ip = "0.0.0.2" },
                { name ="rule1.2", start_ip="0.0.0.4" , end_ip = "0.0.0.5" },
              ],
 
    "second"= [ { name ="rule2.1", start_ip="0.0.1.1" , end_ip = "0.0.1.2" } ],
 
    "third" = [ { name ="rule3.1", start_ip="0.0.3.1" , end_ip = "0.0.3.2" },
                { name ="rule3.2", start_ip="0.0.3.4" , end_ip = "0.0.3.5" },
              ]
  }
  
  fw_rules = flatten([
    for rule_name in local.firewall_rules : [
      for r in local.firewall_rules_lookup[rule_name] : {
         name = r.name
         start_ip = r.start_ip
         end_ip = r.end_ip
      }
    ]
  ])
}