当输出为元组时,将地形模块输出与其他子模块一起使用



我正在用一个模块创建AWS S3存储桶,该模块使用存储桶名称的字符串列表

回购布局类似于

├── modules
│   └── s3
│       ├── main.tf
│       └── outputs.tf
├── main.tf
├── ouputs.tf

S3模块main.tf看起来像这个

variable "bucket_name" {
type        = string
description = "Bucket name"
default     = ""
}
resource "aws_s3_bucket" "s3_bucket" {
bucket = var.bucket_name
}
resource "aws_s3_bucket_public_access_block" "public" {
bucket = aws_s3_bucket.s3_bucket.id
block_public_acls       = true
block_public_policy     = true
ignore_public_acls      = true
restrict_public_buckets = true
}
resource "aws_s3_bucket_acl" "acl" {
bucket = aws_s3_bucket.s3_bucket.id
acl    = "private"
}
resource "aws_s3_bucket_versioning" "versioning" {
bucket = aws_s3_bucket.s3_bucket.id
versioning_configuration {
status = "Enabled"
}
}

S3模块输出.tf看起来像这个

# S3 bucket outputs
output "id" {
value = aws_s3_bucket.s3_bucket.id
}
output "name" {
value = aws_s3_bucket.s3_bucket.bucket
}
output "arn" {
value = aws_s3_bucket.s3_bucket.arn
}

父main.tf看起来像这个

# Bucket list
locals {
buckets = [
"one",
"two"
]
}
variable "random_string" {
type        = string
description = "(optional) describe your variable"
default = "0i0iPKPK"
}
# Add data domain bucket
module "aws_s3_bucket" {
source      = "./modules/s3"
for_each    = toset(local.buckets)
bucket_name = format("%s-%s", var.random_string, each.key)
}
# Add Snowflake storage integration(s)
module "snowflake_storage_integration" {
providers = {
snowflake = snowflake.github
}
source                           = "./modules/storageintegrations/"
for_each                         = toset(local.buckets)
bucket_storage_integration_name  = format("%s-%s", each.key, var.random_string)
aws_s3_bucket_name               = ????
}

父输出.tf看起来像这个

# S3 bucket outputs
output "s3_bucket_id" {
value = values(module.aws_s3_bucket)[*].id
}
output "s3_bucket_name" {
value = values(module.aws_s3_bucket)[*].name
}
output "s3_bucket_arn" {
value = values(module.aws_s3_bucket)[*].arn
}

我不完全确定我这样做是否正确?

正在创建具有所有正确名称和设置的bucket,但我是否正确输出S3模块outputs.tf?

而且,下一步将是将每个存储桶与雪花存储集成一起使用

我不知道如何获得每个bucket的S3 bucket名称并将其传递给集成模块

我认为现在我的bucket名称是元组,但我认为我需要将每个值作为字符串?

有人能澄清一下我是否做得不好吗?

感谢

您所做的似乎并没有错误,如果返回三个单独的元组,其中包含每个不同的属性值,那么这是一件很好且有效的事情。

有些人更喜欢将特定对象组的所有结果收集到一个输出值中,该输出值是对象的集合,因为这可能会使在模块之外使用该结果变得更容易,而不必首先重新组装所有相关的ID、名称和ARN。如果这对你来说很有价值,那么你可以使用如下定义的单个输出值来实现它:

output "s3_buckets" {
value = {
for n, b in module.aws_s3_bucket : n => {
id   = b.id
name = b.name
arn  = b.arn
}
}
}

你的方法和另一种方法都不是普遍的更好;这实际上取决于你将如何使用这些结果。如果你还没有将这些输出值用于除人类参考之外的任何其他用途,那么坚持你所拥有的,等待你有更充分的理由选择特定形状的输出肯定没有坏处,因此可以根据你学到的需求做出更合理的设计权衡。

最新更新