如何从驻留在 Terraform 中不同模块中的另一个 main.tf 文件引用 id 值

How to reference an id value from another main.tf file residing in a different module in Terraform

有没有办法从位于不同模块中的不同 main.tf 文件中的另一个对象引用 id 值?

如果这两个资源或对象位于同一个文件中,您只需执行此操作

resource "aws_s3_bucket" "log_bucket" {
  bucket = "my-tf-log-bucket"
  acl    = "log-delivery-write"
}

resource "aws_s3_bucket" "b" {
  bucket = "my-tf-test-bucket"
  acl    = "private"

  logging {
    target_bucket = aws_s3_bucket.log_bucket.id
    target_prefix = "log/"
  }
}

您可以将用于记录的 target_bucket 分配给 resource "aws_s3_bucket"

中的存储桶 ID

现在假设我有两个名为 log_modules3_module 的文件夹及其各自的 main.tf 文件。

log_module里面的main.tf包含

resource "aws_s3_bucket" "log_bucket" {
  bucket = "my-tf-log-bucket"
  acl    = "log-delivery-write"
}

并且 s3_module 中的 main.tf 包含

resource "aws_s3_bucket" "b" {
  bucket = "my-tf-test-bucket"
  acl    = "private"

  logging {
    target_bucket = "target-bucket"
    target_prefix = "log/"
  }
}

如何为 resource "aws_s3_bucket" "log_bucket" 中的存储桶分配 ID 在 main.tf 中的 target_bucket 对于 s3_module?

您可以使用 Terraform output values 来实现此功能。

在您的 log_module 目录中,您可以创建一个名为 outputs.tf 的新文件并定义一个新的输出,如下所示:

output "bucket_id" {
  value = aws_s3_bucket.log_bucket.id
}

在您的 s3_module 中,您需要创建一个 variables 文件(例如 variables.tf),该文件将用于为 target_bucket 分配一个值aws_s3_bucket 资源。

例如:

variable "target_bucket" {
  description = "The name of the bucket that will receive the log objects"
  type        = string
}

然后您将修改 s3_module 目录中的 main.tf 文件,如下所示:

resource "aws_s3_bucket" "b" {
  bucket = "my-tf-test-bucket"
  acl    = "private"

  logging {
    target_bucket = var.target_bucket
    target_prefix = "log/"
  }
}

其中 target_bucket 的值来自 var.target_bucket

然后您必须在存储库的根目录中创建一个 main.tf 文件,如下所示:

module "logging" {
  source = "/path/to/log_module/directory"

  // Any inputs to the module defined here
}

module "s3" {
  source = "/path/to/s3_module/directory"

  target_bucket = module.logging.bucket_id
}

存储库根目录中的 main.tf 文件在 s3logging 模块之间创建隐式依赖关系。 s3 模块依赖于 logging 模块,因为 target_bucket 的值使用 logging 模块的输出,即 S3 存储桶的 ID。

如果您谈论的是父配置中包含的两个模块(即所有内容都处于同一状态),那么@jasonwalsh 的答案是正确的。

如果您谈论的是具有不同状态文件的两个完全独立的 Terraform 配置(即您分别对它们 运行 terraform apply),您将需要使用 remote state data source,在输出值的模块中结合 outputs

这允许一个 Terraform 配置从一个完全独立的 Terraform 配置读取输出值,而无需它们是同一父配置的子配置。