Terraform 从远程状态调用值

Terraform 从远程状态调用值,terraform,Terraform,我有一个模块集群,它旋转一个GKE集群和相关的GCS存储桶。 此操作的后端是一个名为cluster\u tf\u state\u bucket的GCS bucket 我在这个模块中定义了一个输出 output "vault_storage_bucket_name" { value = "${google_storage_bucket.vault_storage.name}" } 一旦我运行代码,我就会得到输出 ✗ terraform output vault_storage_bucket_

我有一个模块集群,它旋转一个GKE集群和相关的GCS存储桶。 此操作的后端是一个名为cluster\u tf\u state\u bucket的GCS bucket

我在这个模块中定义了一个输出

output "vault_storage_bucket_name" {
  value = "${google_storage_bucket.vault_storage.name}"
}
一旦我运行代码,我就会得到输出

✗ terraform output
vault_storage_bucket_name = vault-storage
现在我有了另一个模块vault,在该模块中,我需要从使用不同GCS后端存储桶的另一个模块调用vault_storage_bucket_name的值

因此,在我的vault模块的main.tf中,我做了如下操作

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

我错过了什么

上游状态快照的输出值通过名为outputs的属性显示在terraform_remote_state上,因此您需要在表达式中包含该值:

  storage_bucket_name   = data.terraform_remote_state.cluster_vault.outputs.vault_storage_bucket_name
请注意.vault\u storage\u bucket\u 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
}

很可能您尚未在vault模块中定义storage_bucket_name变量。谢谢您解决了这个问题。但现在我发现这个对象没有参数、嵌套块或名为vault\u storage\u bucket\u name的导出属性。你知道为什么吗?这与0.12中的状态工作方式不同: