【问题标题】:Terraform getting private subnets for a security groupTerraform 获取安全组的私有子网
【发布时间】:2023-03-03 11:12:02
【问题描述】:

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

这是我的代码(我注释掉了过滤器,所以这应该得到所有子网 - 我的 vpc 有 3 个公共子网和 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

【问题讨论】:

    标签: terraform terraform-provider-aws


    【解决方案1】:

    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 数据中安全地迭代子网列表。但请注意:

    将设置值传递给 tolist 以将其转换为列表。由于集合元素没有排序,因此结果列表将具有未定义的顺序,这将在特定的 Terraform 运行中保持一致。

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

    【讨论】:

    • 也可以直接使用该设置值作为for_each 参数,其优点是aws_subnet.example 将是从子网ID 到主题对象的映射,而不是词汇中的子网对象列表按 ID 排序。
    猜你喜欢
    • 2020-10-17
    • 2019-06-24
    • 2020-02-07
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2020-04-21
    相关资源
    最近更新 更多