Terraform 嵌套 for 循环

Posted

技术标签:

【中文标题】Terraform 嵌套 for 循环【英文标题】:Terraform nest for loop 【发布时间】:2021-07-08 19:01:23 【问题描述】:

我在这里有点挣扎,想知道这是否可能。我有一个贴花的变量,如下所示:

variable "subnets" 
  type = list(object(
    name = string
    cidr_block = string
  ))
  default = [
    
      name = private
      cidr_block = 10.0.0.1/24
    ,
    
      name = public
      cidr_block = 10.0.0.2/24
    
  ]

然后我使用数据源查询当前区域的区域

data aws_availability_zones available 

现在我要做的是在每个 az 区域中创建上述子网,但我似乎无法将这些区域与上述 var 结合起来。

我正在尝试的是

resource aws_suubnet subnet 
 for each  = for idx,az.name in data.aws_availability_zones.available.names : idx => az.name
 vpc_id    = var.vpc_id
 availability_zone = data.aws_availability_zones.available.names[each.key]
 cidr_block = (this is where I want to query my var.subnets but I don't seem to be able to do another for 
 here)

我希望最终得到 6 个子网,3 个私有子网和 3 个公共子网,每个区域各有一个。将不胜感激这里的任何帮助。谢谢

【问题讨论】:

你只有两个cidr_block?您想如何创建 6 个子网?您缺少 4 个cidr_block 【参考方案1】:

我认为您的意图是动态选择两个可用的可用区域并在每个可用区域中声明一个子网。

这是可以做到的,我将在下面展示一个配置示例,但首先我想提醒一下,这是一个有潜在风险的设计,因为可用区的集合会随时间而变化,因此您可能会发现没有任何直接更改根据您的配置,稍后的 Terraform 计划建议在不同的可用区重新创建一个或两个子网。

出于这个原因,我通常建议将子网分配给可用区是您有意选择并在配置中静态编码的东西,而不是动态选择它们,以确保您的配置效果随着时间的推移保持稳定,除非您有意改变它。


除此之外,我仍然想在这里回答一般性问题,因为在其他情况下可能会出现这种将两个不同长度的集合“拉在一起”的一般想法,因此了解它的模式可能仍然证明是有用的,包括如果您最终决定将可用区列表作为变量而不是数据源查找。

variable "subnets" 
  type = list(object(
    name       = string
    cidr_block = string
  ))


data "aws_availability_zones" "available" 


locals 
  # The availability zones are returned as an unordered
  # set, so we'll sort them to be explicit that we're
  # depending on one particular ordering.
  zone_names = sort(data.aws_availabililty_zones.available.names)

  subnets = tolist([
    for i, sn in var.subnets : 
      name       = sn.name
      cidr_block = sn.cidr_block
      zone       = element(local.zone_names, i)
    
  ])

上面示例中的最后一个表达式依赖于the element function,这类似于像local.zone_names[i] 这样的索引,但如果i 太大,它不会返回错误,而是会环绕并从再次列出区域列表。

【讨论】:

以上是关于Terraform 嵌套 for 循环的主要内容,如果未能解决你的问题,请参考以下文章

使用 terraform 在 for_each 嵌套资源中循环

Terraform 是不是支持带有少量操作的 CloudFormation 模板

需要说明如何使用 Terraform 管理 Google Cloud 项目

Terraform 嵌套动态块:不支持的块类型

使用 Terraform 删除以前的快照并创建 EBS 卷的新快照

将现有 GKE 集群添加到 terraform stat 文件