Вызов значения из удаленного состояния - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть модуль cluster, который раскручивает кластер GKE и связанные корзины GCS. Бэкендом для этого является GCS-контейнер с именем cluster_tf_state_bucket

. Я определил выход в этом модуле

output "vault_storage_bucket_name" {
  value = "${google_storage_bucket.vault_storage.name}"
}

. После запуска кода я получаю вывод

* 1009. *

Теперь у меня есть другой модуль vault, и в этом модуле мне нужно вызвать значение vault_storage_bucket_name из другого модуля, который использует другой бэкэнд-контейнер GCS.

Так что в основном .tf моего vault модуля, я делаю что-то вроде

terraform {
  required_version = ">= 0.12.2"
}

terraform {
  backend "gcs" {
    bucket = "app_tf_state_bucket"
    prefix = "vault"
  }
}
data "terraform_remote_state" "cluster_vault" {
  backend = "gcs"
  config = {
    bucket  = "cluster_tf_state_bucket"
  }
}

module "vault" {
  source                = "../../../modules/vault"
  env                   = "test"
  region                = "europe-west5"
  storage_bucket_name   = "${data.terraform_remote_state.cluster_vault.vault_storage_bucket_name}"

Но когда я запускаю этот код, я получаю

Error: Unsupported argument

  on main.tf line 24, in module "vault":
  24:   storage_bucket_name   = "${data.terraform_remote_state.cluster_vault.vault_storage_bucket_name}"

An argument named "storage_bucket_name" is not expected here.

Я решил вышеупомянутую проблему, добавив нижеприведенную файл `variables.tf

variable "storage_bucket_name"{
  type = "string"
}

А теперь я сталкиваюсь с ошибкой

Error: Unsupported attribute

  on main.tf line 24, in module "vault":
  24:   storage_bucket_name   = "${data.terraform_remote_state.cluster_vault.vault_storage_bucket_name}"

This object has no argument, nested block, or exported attribute named
"vault_storage_bucket_name".

Чего мне здесь не хватает?

1 Ответ

1 голос
/ 19 февраля 2020

Выходные значения из снимка состояния в восходящем направлении отображаются в terraform_remote_state через атрибут с именем outputs, поэтому вам необходимо включить его в выражение:

  storage_bucket_name   = data.terraform_remote_state.cluster_vault.outputs.vault_storage_bucket_name

Обратите внимание на дополнительные .outputs до .vault_storage_bucket_name. Этот атрибут outputs является значением карты, поэтому вы также можете использовать карту целиком в выражениях. Например, вы можете создать локальное значение , если ожидаете много ссылок на эти удаленные атрибуты и хотите упростить ссылки:

locals {
  vault_cluster = data.terraform_remote_state.cluster_vault.outputs
}

module "vault" {
  source                = "../../../modules/vault"
  env                   = "test"
  region                = "europe-west5"
  storage_bucket_name   = local.vault_cluster.vault_storage_bucket_name
}
...