在将模块与 for_each 一起使用时,我很难获得输出。
用于创建 S3 的模块- https://github.com/terraform-aws-modules/terraform-aws-s3-bucket/blob/master/outputs.tf
主.tf
module "aws_s3_bucket" {
source = "terraform-aws-modules/s3-bucket/aws"
version = "4.1.2"
create_bucket = var.create_bucket
for_each = var.bucket
}
output "s3_bucket_arn" {
description = "The ARN of the bucket. Will be of format arn:aws:s3:::bucketname."
value = module.aws_s3_bucket.s3_bucket_arn
}
output "s3_bucket_bucket_domain_name" {
description = "The bucket domain name. Will be of format bucketname.s3.amazonaws.com."
value = module.aws_s3_bucket.s3_bucket_bucket_domain_name
}
变量.tf
variable "create_bucket" {
type = string
description = "(Required) Environment for the deployment"
}
variable "bucket" {
type = set(string)
description = "(Required) Environment for the deployment"
}
provider.tf
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "5.47.0"
}
}
}
provider "aws" {
region = "us-west-2"
}
dev.tfvars
create_bucket = "true"
bucket = ["s3bucket_random_8999312381", "s3bucket_random_7234023847"]
计划阶段的错误:
│ 错误:不支持的属性 │ │ 在 s3_module.tf 第 18 行, 输出“s3_bucket_arn”: │ 18:值 = module.aws_s3_bucket.s3_bucket_arn │ ├────────────── │ │ module.aws_s3_bucket 是具有 2 个属性的对象 │ │ 该对象确实 没有名为“s3_bucket_arn”的属性。
│ 错误:不支持的属性 │ │ 在 s3_module.tf 第 23 行, 输出“s3_bucket_bucket_domain_name”: │ 23:值 = module.aws_s3_bucket.s3_bucket_bucket_domain_name │
├────────────── │ │ module.aws_s3_bucket 是具有 2 的对象 属性 │ │ 该对象没有名为 “s3_bucket_bucket_domain_name”。
在没有 for_each 条件的情况下创建单个 s3 时,代码可以正常工作。 你能帮忙吗,我完全迷失了,无法解决这个问题。
多种选择,但没有运气。
您已在
for_each
块中使用了 module "aws_s3_bucket"
,因此您拥有该模块的多个实例。
这部分错误消息表明该模块有两个实例:
module.aws_s3_bucket is object with 2 attributes
使用
for_each
的模块调用将成为一个对象,其中 for_each
的每个元素都有一个属性,因此该对象的两个属性将与 var.bucket
中选择的键匹配,在您的情况下将生成以下两个对象:
module.aws_s3_bucket["s3bucket_random_8999312381"]
module.aws_s3_bucket["s3bucket_random_7234023847"]
由于您有此模块的两个实例,因此您也有两个存储桶 ARN 和两个存储桶域名,因此您需要决定如何在输出值中报告这两个实例。
一种方法是将所有这些组合成一个输出值,该输出值是对象的映射,其中键是来自
var.bucket
: 的值
output "s3_buckets" {
value = tomap({
for k, b in module.aws_s3_bucket : k => {
arn = b.s3_bucket_arn
domain_name = b.s3_bucket_bucket_domain_name
}
})
}
for
表达式 将 module.aws_s3_bucket
的属性投影到更简单的数据结构中,该数据结构仅包含您想要在问题示例中导出的两个值。
旁注:在 Terraform 中,集合类型的输入变量通常具有复数名称。描述存储桶键集的变量具有集合类型(字符串集),因此理想情况下应将其命名为
buckets
(复数)而不是 bucket
(单数)以反映这一点。