Terraform Conditional в зависимости от того, был ли создан ресурс

Я создал вычислительный модуль с условием создания внешнего 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, и я застрял здесь.

Заранее спасибо!


person glux    schedule 13.03.2019    source источник
comment
Таким образом, ваше намерение сделать необязательный аргумент с null невозможно до версии 0.12, но ваша настоящая проблема заключается в том, что вам нужно установить его для всех network_interface.   -  person Matt Schuchard    schedule 13.03.2019


Ответы (2)


Два способа исправить это:

  1. TF_WARN_OUTPUT_ERRORS=1 terraform apply
  2. ${element(concat(google_compute_address.*.address, list("")), 0)}
person victor m    schedule 13.03.2019
comment
Ни 1, ни 2 не работали. Для 1 я все еще получаю тот же ресурс, который не найден для ошибки переменной. Для 2 я получаю следующее: Ошибка: конфигурация ресурса 'google_compute_instance.compute': неизвестный ресурс 'google_compute_address. *', Указанный в переменной google_compute_address. *. Address - person glux; 14.03.2019
comment
попробуйте: $ {element (concat (google_compute_address.external. *. address, list ()), 0)} - person victor m; 14.03.2019

Когда я попытался использовать подобное условное выражение, я получил следующую ошибку:

* 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

person Jimmy Huang    schedule 19.05.2019