如何从驻留在 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_module
和 s3_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
文件在 s3
和 logging
模块之间创建隐式依赖关系。 s3
模块依赖于 logging
模块,因为 target_bucket
的值使用 logging
模块的输出,即 S3 存储桶的 ID。
如果您谈论的是父配置中包含的两个模块(即所有内容都处于同一状态),那么@jasonwalsh 的答案是正确的。
如果您谈论的是具有不同状态文件的两个完全独立的 Terraform 配置(即您分别对它们 运行 terraform apply
),您将需要使用 remote state data source,在输出值的模块中结合 outputs
。
这允许一个 Terraform 配置从一个完全独立的 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"
现在假设我有两个名为 log_module
和 s3_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
文件在 s3
和 logging
模块之间创建隐式依赖关系。 s3
模块依赖于 logging
模块,因为 target_bucket
的值使用 logging
模块的输出,即 S3 存储桶的 ID。
如果您谈论的是父配置中包含的两个模块(即所有内容都处于同一状态),那么@jasonwalsh 的答案是正确的。
如果您谈论的是具有不同状态文件的两个完全独立的 Terraform 配置(即您分别对它们 运行 terraform apply
),您将需要使用 remote state data source,在输出值的模块中结合 outputs
。
这允许一个 Terraform 配置从一个完全独立的 Terraform 配置读取输出值,而无需它们是同一父配置的子配置。