Terraform中for_each语法如何结合条件判断控制资源创建
实现方案
你可以通过三元条件表达式改写for_each的取值,当指定变量值等于"X"时传入原有资源集合,否则传入空集合,即可实现资源的条件创建,具体操作如下:
步骤1:声明控制变量
在variables.tf中定义你要做判断的变量(已经定义的话可跳过):
variable "custom_switch" { type = string description = "控制ASG region标签是否创建的开关,取值为X时启用资源" default = "" }
你可以直接在tfvars文件中给该变量赋值,比如custom_switch = "X"即可启用对应资源。
步骤2:改写资源的for_each逻辑
修改你的aws_autoscaling_group_tag资源代码如下:
resource "aws_autoscaling_group_tag" "region" { # 核心条件逻辑:变量等于X时用原有节点组集合,否则用空集合不创建资源 for_each = var.custom_switch == "X" ? aws_eks_node_group.managed_workers : {} autoscaling_group_name = each.value.resources[0].autoscaling_groups[0].name tag { key = "topology.kubernetes.io/region" value = "eu-west-2" propagate_at_launch = true } }
原理解释
- 当
var.custom_switch取值为"X"时,for_each会遍历你所有的EKS托管节点组,为每个节点组对应的ASG创建标签 - 当
var.custom_switch取值不等于"X"时,for_each接收空映射,Terraform会判定该资源不需要创建任何实例,达到跳过执行的效果
兼容场景补充
如果你的aws_eks_node_group.managed_workers是用count而不是for_each声明的列表类型资源,只需要把for_each部分改成如下写法即可:
for_each = var.custom_switch == "X" ? toset([for node in aws_eks_node_group.managed_workers : node.id]) : toset([])
内容的提问来源于stack exchange,提问作者hache cheche
相关产品推荐
相关产品推荐

