通过CIDR块获取子网ID的Terraform解决方案

75次阅读
没有评论

问题描述

想要根据一组CIDR块获取相应的子网ID。他在使用Terraform时遇到了这个问题。用户已经知道VPC的ID,现在想要通过Terraform的数据源获取一个包含子网ID的数组,以便将其作为参数传递给另一个模块。

以下是用户提供的问题描述和最佳回答。

解决方案

请注意以下操作可能因Terraform版本而异。

您可以通过使用aws_subnet数据源以及for_each选项来实现这个目标。通过将for_each设置为您的CIDR范围列表,您可以告诉Terraform为每个CIDR范围分别调用一次数据源。以下示例假定您的问题中的my_subnets位于一个locals块内,并且已经声明并定义了local.my_subnets以保存这个字符串列表。

data "aws_subnet" "example" {
  for_each   = toset(local.my_subnets)
  cidr_block = each.key
}

具有设置for_each的资源在表达式中显示为一个对象映射,其中映射键与for_each映射键(在这种情况下是集合元素)相同。因此,您可以从中派生出CIDR块到子网ID的映射:

locals {
  subnet_ids = tomap({
    for cidr, subnet in data.aws_subnet.example :
    cidr => subnet.id
  })
}

如果您实际上不关心CIDR块和ID之间的对应关系,只想要一组扁平的ID集合,您可以忽略实例键:

locals {
  subnet_ids = toset([
    for subnet in data.aws_subnet.example :
    subnet.id
  ])
}

这两者中的第二个似乎是您想要分配给subnet_ids参数的预期结果:

vpc_options {
  subnet_ids = [
    for subnet in data.aws_subnet.example :
    subnet.id
  ]
}

在这个示例中,我在内联表达式中省略了toset调用,因为vpc_options块的架构将已经告诉Terraform subnet_ids是一个集合或列表,因此在这种情况下Terraform可以自动进行转换。

结论

通过使用Terraform的数据源和for_each选项,您可以轻松地根据CIDR块获取相应的子网ID,并将其传递给其他模块作为参数。以上解决方案提供了两种不同的方法来获取子网ID集合,您可以根据实际需求选择适合您情况的方式。

正文完