Чтение вложенного атрибута в источнике данных (службы Cloud Run, которая может не существовать) в Terraform

Я использую Terraform v0.14.4 с GCP. У меня есть служба Cloud Run, которой нельзя управлять с помощью Terraform (она может существовать или нет), и я хочу прочитать ее URL-адрес.

Если служба существует, это работает нормально:

data "google_cloud_run_service" "myservice" {
  name = "myservice"
  location = "us-central1"
}

output "myservice" {
  value = data.google_cloud_run_service.myservice.status[0].url
}

Но если его нет, я не могу заставить его работать !. Что я пробовал:

  • data.google_cloud_run_service.myservice.*.status[*].url

    статус равен нулю

  • length(data.google_cloud_run_service.myservice) > 0 ? data.google_cloud_run_service.myservice.*.status[0].url : ""

  • Пробовал с join("", data.google_cloud_run_service.myservice.*.status)

    Я получаю эту ошибку: data.google_cloud_run_service.myservice is object with 9 attributes

  • coalescelist(data.google_cloud_run_service.myservice.*.status, <...>)

    Он просто возвращает [null], а использование compact вместо результата дает мне Invalid value for "list" parameter: element 0: string required.

Любые идеи?


person dusan    schedule 10.02.2021    source источник


Ответы (1)


Похоже, вы здесь немного работаете против дизайна этого источника данных, но, судя по сообщениям об ошибках, которые вы показали, похоже, что поведение таково, что status имеет значение null, когда запрошенный объект не существует, и является списком, когда это так, поэтому вам нужно написать выражение, которое может справиться с обеими ситуациями.

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

output "myservice" {
  value = (
    data.google_cloud_run_service.myservice.status != null ?
    data.google_cloud_run_service.myservice.status[0].url :
    null
  )
}

Есть еще один потенциально более короткий способ написать это, полагаясь на функцию try может улавливать динамические ошибки и возвращать резервное значение, хотя это действительно противоречит рекомендациям в документации, поскольку заставляет незнакомого будущего читателя делать немного больше догадок, чтобы понять, в каких ситуациях выражение может быть успешным, а какое он может вернуть запасной вариант:

output "myservice" {
  value = try(data.google_cloud_run_service.myservice.status[0].url, null)
}
person Martin Atkins    schedule 11.02.2021