J'ai un module cluster qui fait tourner un cluster GKE et les buckets GCS associés. Le backend pour cela est un bucket GCS appelé cluster_tf_state_bucket

J'ai défini une sortie dans ce module

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

Une fois que j'exécute le code, j'obtiens la sortie

✗ terraform output
vault_storage_bucket_name = vault-storage

Maintenant, j'ai un autre module vault et dans ce module, je dois appeler la valeur de vault_storage_bucket_name à partir de l'autre module qui utilise un autre compartiment principal GCS.

Donc, dans le main.tf de mon module vault, je fais quelque chose comme

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}"

Mais quand j'exécute ce code, j'obtiens

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.

J'ai résolu le problème ci-dessus en ajoutant ce qui suit au fichier `variables.tf

variable "storage_bucket_name"{
  type = "string"
}

Et maintenant je rencontre l'erreur

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".

Qu'est-ce que j'oublie ici ?

0
Jason Stanley 19 févr. 2020 à 19:03

1 réponse

Meilleure réponse

Les valeurs de sortie de l'instantané d'état en amont sont exposées sur terraform_remote_state via un attribut appelé outputs, vous devez donc l'inclure dans votre expression :

  storage_bucket_name   = data.terraform_remote_state.cluster_vault.outputs.vault_storage_bucket_name

Notez le .outputs supplémentaire avant .vault_storage_bucket_name. Cet attribut outputs est une valeur de carte, vous pouvez donc potentiellement également utiliser la carte dans son ensemble dans les expressions. Par exemple, vous pouvez créer une Valeur locale si vous pensez être faisant beaucoup référence à ces attributs distants et souhaitez simplifier les références :

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
}
1
Martin Atkins 19 févr. 2020 à 17:13