Terraform 0.12 – 获取每个子网的 cidr_block

81次阅读
没有评论

问题描述

在使用 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"]
}
  1. 接着,在数据源中使用 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 对应的对象中
}
  1. 最后,使用 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 官方文档或社区讨论寻求帮助。

正文完