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

Dar*_*tle 3 amazon-s3 amazon-web-services terraform infrastructure-as-code

有没有办法从位于不同模块的不同 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/"
  }
}
Run Code Online (Sandbox Code Playgroud)

您可以将用于日志记录的target_bucket分配给bucket的idresource "aws_s3_bucket"

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

main.tflog_module 内部包含

resource "aws_s3_bucket" "log_bucket" {
  bucket = "my-tf-log-bucket"
  acl    = "log-delivery-write"
}
Run Code Online (Sandbox Code Playgroud)

main.tfs3_module 内部包含

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

  logging {
    target_bucket = "target-bucket"
    target_prefix = "log/"
  }
}
Run Code Online (Sandbox Code Playgroud)

如何将存储桶的 id 分配给s3_moduleresource "aws_s3_bucket" "log_bucket" 中的 target_bucket ?main.tf

jas*_*lsh 6

您可以使用 Terraform输出值来实现此功能。

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

output "bucket_id" {
  value = aws_s3_bucket.log_bucket.id
}
Run Code Online (Sandbox Code Playgroud)

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

例如:

variable "target_bucket" {
  description = "The name of the bucket that will receive the log objects"
  type        = string
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样修改目录main.tf中的文件:s3_module

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

  logging {
    target_bucket = var.target_bucket
    target_prefix = "log/"
  }
}
Run Code Online (Sandbox Code Playgroud)

其中 的值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
}
Run Code Online (Sandbox Code Playgroud)

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