【问题标题】:Dynamic resources for_each output in terraform moduleterraform 模块中的动态资源 for_each 输出
【发布时间】:2021-09-24 14:53:53
【问题描述】:

Terraform v1.0.0 提供者:aws v3.49.0

我使用模块中的 for_each 创建了动态 AWS 子网资源。

资源创建工作正常,但是无法输出动态创建的资源,并且找不到合适的文档。

子网模块是

resource "aws_subnet" "generic" {
  vpc_id = var.vpc_id
  cidr_block = var.cidr_block
  map_public_ip_on_launch = var.public_ip_on_launch
  tags = {
        Name = var.subnet_tag_name
        Environment = var.subnet_environment
      }
}

定义了简单的模块输出

output "subnet_id" {
    value = aws_subnet.generic.id
}

然后从根模块,我在列表变量上创建一个 for_each 循环,以从模块创建多个动态资源

module "subnets" {
  source = "../modules/networking/subnet"
  for_each = var.subnets
  vpc_id = "vpc-09d6d4c17544f3a49"
  cidr_block = each.value["cidr_block"]
  public_ip_on_launch = var.public_ip_on_launch
  subnet_environment = var.subnet_environment
  subnet_tag_name = each.value["subnet_tag_name"]
}

当我在根模块中没有定义输出的情况下运行它时,事情会正常创建。当我尝试定义输出时问题就来了

output "subnets" {
    value = module.subnets.*.id
    description = "Imported VPC ID"
}

出现这个错误

│ Error: Unsupported attribute
│
│   on output.tf line 2, in output "subnets":
│    2:     value = module.subnets.*.id
│
│ This object does not have an attribute named "id".

我尝试了不同的输出定义。希望获得有关如何正确定义使用 for_each 模块动态创建的实例输出的指导。

【问题讨论】:

  • [*].* 只能用于列表。此资源使用for_each,因此它输出map 而不是list。我想看看你的变量文件是什么样子的

标签: terraform terraform-provider-aws


【解决方案1】:

根据Terraform documentation,“splat”运算符 (*) 只能用于列表,并且由于您使用的是 for_each,因此您的输出将是一个地图。

您需要使用地图/列表推导来实现您想要的。

对于作为键/值对映射的输出(请注意,我已将输出描述更改为更有意义的内容):

output "subnets" {
    value = {
        for k, v in module.subnets:
        k => v.subnet_id
    }
    description = "Subnet IDs"
}

对于仅包含子网 ID 的列表:

output "subnets" {
    value = [
        for k, v in module.subnets:
        v.subnet_id
    ]
    description = "Subnet IDs"
}

【讨论】:

  • 它抛出了一个错误“这个对象没有一个名为“id”的属性。”。通过修改为“k => v.subnet_id”而不是 id 来解决此问题;子模块的输出。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2021-03-07
  • 2021-10-04
  • 1970-01-01
  • 2021-05-25
  • 2021-11-06
  • 1970-01-01
  • 2020-01-13
  • 2021-03-31
相关资源
最近更新 更多