Terraform 为安全组获取私有子网

Terraform getting private subnets for a security group

我正在尝试在我的 VPC 中获取私有子网,我使用的是 Terraform 文档中的示例 https://www.terraform.io/docs/providers/aws/d/subnet_ids.html 但这给我带来了错误。

这是我的代码(我注释掉了过滤器,所以这应该得到所有子网 - 我的 vpc 有 3 个 public 和 3 个私有子网)

data "aws_subnet_ids" "example" {
  vpc_id = var.vpc_id
//  filter {
//    name = "tag:Tier"
//    values = ["private"]
//  }
}

data "aws_subnet" "example" {
  count = length(data.aws_subnet_ids.example.ids)

  id = data.aws_subnet_ids.example.ids[count.index]
}

我在 id = data.aws_subnet_ids...

上收到错误

我得到以下错误 6 次,每个索引 1 次

Error: Invalid index

  on modules/global/data.tf line 20, in data "aws_subnet" "example":
  12:   id = data.aws_subnet_ids.example.ids[count.index]
    |----------------
    | count.index is 5
    | data.aws_subnet_ids.example.ids is set of string with 6 elements

This value does not have any indices.

我正在使用 HCL2,但以防万一我对具有相同结果的所有语句恢复到之前的插值 ("${data.aws_subnet_ids.example.ids[count.index]}")。

帮助?

谢谢

$ terraform --version
Terraform v0.12.7
+ provider.aws v2.25.0
+ provider.template v2.1.2

aws_subnet_ids 数据的输出是一个集合而不是列表。您需要将其转换为列表。您可以使用 tolist 函数 documented here.

实现此目的

您的代码可以更新如下:

data "aws_subnet" "example" {
  count = length(data.aws_subnet_ids.example.ids)
  id    = tolist(data.aws_subnet_ids.example.ids)[count.index]
}

然后可以在您的 aws_subnet 数据中安全地迭代子网列表。但是请注意:

Pass a set value to tolist to convert it to a list. Since set elements are not ordered, the resulting list will have an undefined order that will be consistent within a particular run of Terraform.

这意味着如果您要访问特定子网,它们将在 Terraform 计划生成之间的 aws_subnet.example 列表中重新排序。