Рейтинг:1

GCP Terraform: невозможно настроить рекламу подсетей через BGP на облачном маршрутизаторе

флаг ua

Я пытаюсь создать облачный маршрутизатор, из которого рекламируются два сетевых диапазона, однако я получаю очень расплывчатые ошибки от terraform, и я не могу понять, что не так.

ресурс "google_compute_router" "router1" {
  name = "${var.alias}-prod1-ha-vpn-cloud-router-1"
  проект = var.project_name
  сеть = var.network1
  регион = var.region1
  бгп {
    asn = переменная asn
    реклама_режим = "ПОЛЬЗОВАТЕЛЬСКИЙ"
    динамический "advertised_ip_ranges" {
      for_each = var.advertised_ip_ranges_prod1
      содержание {
        диапазон = рекламируемый_ip_ranges_prod1.value["cidr"]
        описание = рекламируемый_ip_ranges_prod1.value["описание"]
      }
    }
  }
}

И собственно код модуля:

модуль "vpn-ha-шлюз" {
  источник = "-----"
  имя_проекта = var.имя_проекта
  клиент = переменная.клиент
  псевдоним = переменная.псевдоним
  регион1 = вар.регион1
  count = (var.vpn_type == "ha-vpn" ? 1 : 0) ## Сборка, если vpn_type равен ha-vpn
  сеть1 = модуль.prod1-vpc.self_link
  customer_redundancy = переменная.customer_redundancy
  customer_ha_vpn_peers = var.customer_ha_vpn_peers
  общий_секрет = переменная.общий_секрет
  asn = переменная asn
  cust_asn = переменная.cust_asn
  рекламируемый_ip_ranges_prod1 = var.advertised_ip_ranges_prod1
}

Мы определяем Advertising_ip_ranges_prod1 как карту, так как мы не знаем, сколько их будет на модуль:

переменная "advertised_ip_ranges_prod1" {
  тип = список (карта (строка))
  description = "рекламируется BGP на prod1"
  по умолчанию = [
    {
        cidr = "1.2.3.4/28" ## Объявленный диапазон Prod1
        desc = "дополнительный диапазон, объявленный через BGP"
    },
    {
        cidr = "5.6.7.8/28" # Проверка объявленного диапазона
        desc = "Тестовый диапазон объявлен через BGP"
    },
  ]
}

И хотя у меня есть другие модули, построенные таким же образом (с for_each), работающие правильно, этот продолжает выдавать эти неясные ошибки:

Ошибка: ссылка на необъявленный ресурс

  на .terraform\modules\vpn-ha\main.tf строка 36, в ресурсе "google_compute_router" "router1":
  36: диапазон = рекламируемый_ip_ranges_prod1.value["cidr"]

"Значение" управляемого ресурса "advertised_ip_ranges_prod1" не объявлено
в module.vpn-ha-gateway.


Ошибка: ссылка на необъявленный ресурс

  на .terraform\modules\vpn-ha-gateway\main.tf строка 37, в ресурсе "google_compute_router" "router1":
  37: описание = рекламируемый_ip_ranges_prod1.value["описание"]

"Значение" управляемого ресурса "advertised_ip_ranges_prod1" не объявлено
в module.vpn-ha-gateway.```

Рейтинг:1
флаг bw

Таким образом, проблема (я думаю) заключается в том, как вы ссылаетесь на текущую итерацию динамического элемента из для каждого "блокировать". Как правило, имя «переменной», которую вы используете для ссылки на текущее значение итератора в для каждого block на самом деле является именем самого динамического тега. В результате, я думаю, вам нужно заменить это:

ресурс "google_compute_router" "router1" {
  name = "${var.alias}-prod1-ha-vpn-cloud-router-1"
  проект = var.project_name
  сеть = var.network1
  регион = var.region1
  бгп {
    asn = переменная asn
    реклама_режим = "ПОЛЬЗОВАТЕЛЬСКИЙ"
    динамический "advertised_ip_ranges" {
      for_each = var.advertised_ip_ranges_prod1
      содержание {
        диапазон = рекламируемый_ip_ranges_prod1.value["cidr"]
        описание = рекламируемый_ip_ranges_prod1.value["описание"]
      }
    }
  }
}

С этим:

ресурс "google_compute_router" "router1" {
  name = "${var.alias}-prod1-ha-vpn-cloud-router-1"
  проект = var.project_name
  сеть = var.network1
  регион = var.region1
  бгп {
    asn = переменная asn
    реклама_режим = "ПОЛЬЗОВАТЕЛЬСКИЙ"
    динамический "advertised_ip_ranges" {
      for_each = var.advertised_ip_ranges_prod1
      содержание {
        диапазон = рекламируемый_ip_ranges.value["cidr"]
        описание = рекламируемый_ip_ranges.value["описание"]
      }
    }
  }
}

например s/advertised_ip_ranges_prod1/advertised_ip_ranges/

Для справки см. самый первый пример в их документации об этом, которая заключается в следующем:

ресурс "aws_elastic_beanstalk_environment" "tfenvtest" {
  имя = "tf-имя-теста"
  приложение = "${aws_elastic_beanstalk_application.tftest.name}"
  solution_stack_name = "64-разрядная версия Amazon Linux 2018.03 v2.11.4 с Go 1.12.6"

  динамическая "настройка" {
    for_each = var.settings
    содержание {
      пространство имен = параметр.значение["пространство имен"]
      имя = настройка.значение["имя"]
      значение = настройка.значение["значение"]
    }
  }
}

Обратите внимание, что они используют настройка.значение, несмотря на то, что имя переменной настройки. Вы в основном сталкиваетесь с той же самой, довольно запутанной разницей.

djsmiley2kStaysInside avatar
флаг ua
Отличный ответ, спасибо. Вот такие мелочи в terraform действительно сбивают меня с толку!

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.