Terraform 'for each' перебирает элементы, которые являются списком строк, не применяя

Я собираюсь создать таблицу маршрутов и связать их с подсетями, так что у меня 3 подсети (list of strings), они уже созданы, но когда я пытаюсь связать таблицу маршрутов с подсетями, она связывается только с первой, и Я предполагаю те же проблемы, когда я пытаюсь связать NAT шлюз, который также является list of strings.

Вот результаты:

  + nat_list = [
      + "nat-0980ffedd5471b76d",
      + "nat-053701e207f6e92b2",
      + "nat-0be06d45baf164edc",
    ]

  + subnets  = [
      + "subnet-04c920f8908d7e502",
      + "subnet-0e9e9333180cab627",
      + "subnet-0caae55b544e4b63d",
    ]

Вот мой main.tf

resource "aws_route_table" "public" {
   count  = length(local.azs)
   vpc_id = aws_vpc.vpc[0].id
   tags   = var.tags
} <<< Creating without any problems



resource "aws_route" "public_ipv4"  {
   for_each       = { for route in local.public_ipv4 : route.name => route}
   route_table_id = aws_route_table.public.*.id
   
   ...  ...
   
   nat_gateway_id         = ??? lookup(each.value, "nat", "" ) Not working ???
   destination_cidr_block = lookup(each.value, "destination_cidr_block", "" )
   
   ...  ...
}



resource "aws_route_table_association" "public"  {
   count          = length(local.azs)
   subnet_id      = lookup(var.parameters[count.index], "public_subnet", [])
   route_table_id = aws_route_table.public.*.id
}



variable "parameters"                {
   description = "The route table parameters"   
   type        = list(object({
     ... ...
     public_subnet = list(string)
     ... ...
   }))
   default     = []
}

Обновление: локальная переменная

locals {
    public_ipv4 = {[
        {
           name = "NAT(s) to MyLogSys ${local.counter + 1 }"
           nat = aws_nat_gateway.translate.*.id 
           destination_cidr_block = "100.0.20.0/20"
        }
    ]}
}

Я провел исследование, но похоже, что подобной проблемы нет.


person Bow Bow    schedule 17.01.2021    source источник
comment
Что такое local.public_ipv4?   -  person Marcin    schedule 17.01.2021
comment
Привет @Marcin извините, забыл загрузить, пожалуйста, дайте мне 2 минуты   -  person Bow Bow    schedule 17.01.2021
comment
Также я не понимаю, как aws_route_table.public будет Создаваться без каких-либо проблем? это неверно. vpc_id = aws_vpc.vpc должно быть vpc_id = aws_vpc.vpc.id.   -  person Marcin    schedule 17.01.2021
comment
@Marcin извините, да, вы правы, это снова просто опечатка, а скопируйте вставку в портал, это vpc_id = aws_vpc.vpc[0].id Позвольте мне отредактировать еще раз   -  person Bow Bow    schedule 17.01.2021
comment
Вы уверены, что этот код вообще выполняется, поэтому вы знаете, что используется только первый nat? Потому что route_table_id = aws_route_table.public.*.id тоже неверно.   -  person Marcin    schedule 17.01.2021
comment
@Marcin, однако он выполняется, я не знаю, как правильно его использовать route_table_id = aws_route_table.public.*.id, Ничего не работает должным образом в блоке aws_route_table_association, который я использовал aws_route_table.public.*.id[count.index], в блоке aws_route, который я использовал aws_route_table.public[0].id, Ничего не работает должным образом, поэтому я только что вставил сюда последнюю попытку, но да, я проверил, что она не выполняется   -  person Bow Bow    schedule 17.01.2021
comment
Давайте продолжим это обсуждение в чате.   -  person Bow Bow    schedule 17.01.2021


Ответы (1)


На основе обсуждения в чате.

Было предложено заменить:

for_each       = { for route in local.public_ipv4 : route.name => route}

с участием

for_each       = { for idx, route in local.public_ipv4 : idx => route}

где idx будет принимать значения 0,1,2,... в зависимости от размера local.public_ipv4.

Чтобы защитить от доступа к элементам в списках, которые содержат меньше элементов, чем local.public_ipv4, element можно использовать.

person Marcin    schedule 17.01.2021