问题描述
在使用 Terraform 0.12 版本时,用户遇到了一个问题:他有一组子网 ID,希望能够获取与每个子网关联的 cidr_block 数组。他尝试使用 for 循环和 count 数据来解决这个问题,但对于这个本应简单的问题,他却纠结了很长时间,找不到合适的解决方案。他在问题中提供了一个示例,但实际上不能在一个字符串列表上使用 for_each 作为数据源。
解决方案
在执行以下操作之前,请确保你的 Terraform 版本为 0.12 或更高版本。如有需要,请备份你的配置文件。
最佳解决方案
用户在讨论中提到的示例已经接近正确的解决方案,但需要稍作修改。以下是一个基于该示例的最佳解决方案:
1. 首先,在你的 Terraform 配置文件中定义一个变量来存储子网的 ID 列表:
variable "aws_subnet_ids" {
type = list(string)
default = ["subnet-aaaaaaaa", "subnet-bbbbbbbb"]
}
- 接着,在数据源中使用 for_each 来遍历子网 ID 列表,并获取每个子网的 cidr_block:
data "aws_subnet" "subnets" {
for_each = toset(var.aws_subnet_ids)
id = each.value
cidr_blocks = [each.value.cidr_block] # 这里假设 cidr_block 位于子网 ID 对应的对象中
}
- 最后,使用 locals 来整理 cidr_block 并输出结果:
locals {
cidr_blocks = [
for subnet in values(data.aws_subnet.subnets) :
subnet.cidr_blocks[0] # 因为我们只有一个 cidr_block,所以直接取第一个
]
}
output "subnet_cidr_blocks" {
value = local.cidr_blocks
}
这个解决方案中,我们首先使用 for_each 来遍历子网 ID 列表,然后在数据源中获取每个子网的 cidr_block。接着,使用 locals 将 cidr_block 整理成数组,并将结果作为输出。
其他解决方案
在讨论中,有用户提供了一个更简洁的解决方案,但需要注意这种方法在 Terraform 0.12 中可能不适用于所有情况。如果你愿意尝试,可以使用以下方法:
data "aws_subnet" "subnets" {
for_each = toset(var.aws_subnet_ids)
id = each.value
}
output "subnet_cidr_blocks" {
value = [for subnet in data.aws_subnet.subnets : subnet.cidr_block]
}
这个解决方案中,我们直接遍历了 data.aws_subnet.subnets,并获取了每个子网的 cidr_block。但这种写法可能需要你的 Terraform 版本支持 [*]
语法才能正常工作。
总结
通过遵循上述步骤,你可以在 Terraform 0.12 版本中成功获取每个子网的 cidr_block。请根据你的实际情况选择适合你的解决方案,并根据需要进行相应的调整。如果你遇到了问题,也可以查阅 Terraform 官方文档或社区讨论寻求帮助。