【问题标题】:Acquiring subnet availability zone ids in bulk, in a module在模块中批量获取子网可用区 ID
【发布时间】:2022-07-23 15:07:52
【问题描述】:

我正在处理的模块代表一个部署到 VPC 的应用程序。 VPC 在别处声明。

相关数据路径包括以下资源:

variable \"vpc_id\" { }

data \"aws_subnets\" \"private\" {
  filter {
    name   = \"vpc-id\"
    values = [data.aws_vpc.vpc.id]
  }

  filter {
    name = \"tag:Visibility\"
    values = [\"private\"]
  }
}

data \"aws_subnet\" \"private\" {
  for_each = toset(data.aws_subnets.private.ids)

  vpc_id = data.aws_vpc.vpc.id
  id = each.value
}

resource \"aws_rds_cluster\" \"database\" {
  availability_zones = data.aws_subnet.private.*.availability_zones
}

这感觉像是正确的语法,尽管它是一个冗长的数据检索链。然而,当我terraform plan它时:

│ Error: Unsupported attribute
│ 
│   on ../../../../../appmodule/rds_postgres.tf line 23, in resource \"aws_rds_cluster\" \"webapp\":
│   23:   availability_zones = data.aws_subnet.private.*.availability_zone_id
│ 
│ This object does not have an attribute named \"availability_zone_id\".

我正在使用 aws-provider 4.18.0 和 Terraform v1.1.2。 subnet data source 的文档显示 availability_zone_id

我在这里遗漏了一些明显的东西吗?

  • 是的,使用 for_each 创建键值对。您可能可以使用values 内置函数。
  • values(data.aws_subnet.private)[*].availability_zone 这样的东西。

标签: amazon-web-services terraform terraform-provider-aws


【解决方案1】:

如cmets中所述,您可以使用values内置函数[1]获取AZ列表。这是必要的,因为由于for_each 元参数的使用,您提供 AZ 所依赖的数据源采用键值格式:

data "aws_subnet" "private" {
  for_each = toset(data.aws_subnets.private.ids)

  vpc_id = data.aws_vpc.vpc.id
  id = each.value
}

你需要做的改变是:

resource "aws_rds_cluster" "database" {
  availability_zones = values(data.aws_subnet.private)[*].availability_zone
}

使用 output 和默认 VPC 的测试显示以下结果:

  + subnet_azs = [
      + "us-east-1b",
      + "us-east-1c",
      + "us-east-1d",
      + "us-east-1a",
      + "us-east-1f",
      + "us-east-1e",
    ]

如您所见,它已经是一个列表,因此您可以按原样使用它。

请注意,有一个解释为什么应该使用 availability_zone 属性:

availability_zone_id - (可选)子网可用区的 ID。并非所有区域或分区都支持此参数。如有必要,请改用availability_zone


[1]https://www.terraform.io/language/functions/values

【讨论】:

  • 太棒了,谢谢。此错误消息是不透明的,但我理解为什么必须如此。我想在 for_each 上的 Terraform 文档中看到您的示例(或类似内容)。
猜你喜欢
  • 2022-08-24
  • 2015-10-21
  • 2019-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-29
  • 2018-06-13
  • 2021-11-26
  • 1970-01-01
相关资源
最近更新 更多