#google-cloud-platform #terraform #terraform-provider-gcp
#google-cloud-platform #терраформирование #terraform-provider-gcp
Вопрос:
Я создал вычислительный модуль, у которого есть условие для создания внешнего IP.
resource "google_compute_address" "external" {
count = "${var.EXT_IP_CREATE ? 1 : 0}"
name = "${var.NAME}-ext-ip"
address_type = "EXTERNAL"
region = "${var.REGION}"}
В блоке ресурсов вычислительного экземпляра у меня есть следующая конфигурация сетевого интерфейса:
network_interface {
network= "${var.NETWORK}"
network_ip = "${google_compute_address.internal.address}"
access_config {
nat_ip = "${var.EXT_IP_CREATE ? google_compute_address.external.address : 0 }"
}
}
Если ресурс google_compute_address.external не был создан, мне нужно установить nat_ip равным null или, другими словами, 0.
Похоже, что это должно сработать, но это не так.
При установке EXT_IP_CREATE в значение true TF успешно создает ресурс. При установке значения false я получаю следующую ошибку:
Error: Error running plan: 1 error(s) occurred:
* module.compute-dbma-dev.google_compute_instance.compute: 1 error(s) occurred:
* module.compute-dbma-dev.google_compute_instance.compute: Resource 'google_compute_address.external' not found for variable 'google_compute_address.external.address'
Когда я явно передаю nat_ip = 0, TF распознает пустое значение и успешно создает вычислительные экземпляры без внешнего IP.
В настоящее время я использую Terraform версии Terraform v0.11. Вероятно, есть супер простое решение, но я только начинаю с условных выражений в TF и застрял здесь.
Заранее спасибо!
Комментарии:
1. Итак, ваше намерение использовать необязательный аргумент с
null
невозможно до версии 0.12, но ваша реальная проблема здесь в том, что вам нужно установить его для всехnetwork_interface
.
Ответ №1:
Два способа исправить это:
TF_WARN_OUTPUT_ERRORS=1 terraform apply
${element(concat(google_compute_address.*.address, list("")), 0)}
Комментарии:
1. Ни 1, ни 2 не сработали. Для 1 я все еще получаю тот же ресурс, который не найден для переменной error. Для 2 я получаю следующее: Ошибка: конфигурация ресурса ‘google_compute_instance.compute’: неизвестный ресурс ‘google_compute_address.*’, на который ссылается переменная google_compute_address.*.address
2. попробуйте: ${element(concat(google_compute_address.external.*.address, список(«»)), 0)}»
Ответ №2:
Когда я попытался использовать аналогичное условие, я получаю следующую ошибку:
* google_compute_instance.main: __builtin_StringToInt: strconv.ParseInt: parsing "": invalid syntax in:
${var.external_ip != "" ? var.external_ip : 0}
Я не вижу, как можно условно подключить внешний IP-адрес, исходя из того, как в настоящее время работает GCP API [1]:
networkInterfaces[].accessConfigs[].natIP => string
An external IP address associated with this instance. Specify an unused static external IP address available to the project or leave this field undefined to use an IP from a shared ephemeral IP address pool. If you specify a static external IP address, it must live in the same region as the zone of the instance.
[1] https://cloud.google.com/compute/docs/reference/rest/v1/instances