问题描述
想要根据一组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集合,您可以根据实际需求选择适合您情况的方式。