使用 terraform 模块和 for_each 时的输出

问题描述 投票:0回答:1

在将模块与 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 时,代码可以正常工作。 你能帮忙吗,我完全迷失了,无法解决这个问题。

多种选择,但没有运气。

amazon-web-services terraform
1个回答
0
投票

您已在

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
(单数)以反映这一点。

© www.soinside.com 2019 - 2024. All rights reserved.