Terraform配置AKS时for_each与count条件使用异常解决方案
问题原因
原有配置报错核心是两处写法不符合Terraform语法逻辑:
azurerm_subnet数据源的for_each参数接收了布尔类型值local.aks_config.vnet_enabled,但for_each仅支持map、set类型的可迭代集合,直接传布尔值会触发类型校验错误vnet_subnet_id没有做条件分支判断,当vnet关闭时会强制引用不存在的数据源实例,直接触发引用不存在资源的报错
修正后配置
# 仅为开启vnet配置的AKS集群查询对应子网信息 data "azurerm_subnet" "example" { for_each = { for aks_name, aks_conf in local.aks_config : aks_name => aks_conf if aks_conf.vnet_enabled == true } name = each.value.subnet_name virtual_network_name = each.value.vnet_name resource_group_name = var.rg-name } resource "azurerm_kubernetes_cluster" "example" { for_each = local.aks_config name = each.value.name location = each.value.location resource_group_name = var.rg-name dns_prefix = each.value.dns_prefix default_node_pool { name = each.value.default_nodepool_name node_count = each.value.default_nodepool_count vm_size = each.value.default_nodepool_size enable_auto_scaling = each.value.default_node_pool_autoscale min_count = each.value.default_node_pool_autoscale_min_count max_count = each.value.default_node_pool_autoscale_max_count # 按vnet开关状态赋值:开启时取子网ID,关闭时传null vnet_subnet_id = each.value.vnet_enabled ? data.azurerm_subnet.example[each.key].id : null zones = each.value.aks_zones } identity { type = "SystemAssigned" } network_profile { network_plugin = each.value.network_plugin network_policy = each.value.network_policy } }
逻辑说明
- 子网数据源通过for表达式做过滤,仅会为
vnet_enabled = true的AKS集群生成对应的查询实例,vnet_enabled = false的集群完全不会触发子网查询,满足禁用该数据源的要求 vnet_subnet_id通过三目条件运算符做分支判断:当前集群开启vnet时,引用对应子网的资源ID;关闭vnet时直接赋值null,Terraform不会查找不存在的数据源实例,不会触发引用报错- 该逻辑完全兼容现有
.tfvars的变量结构,不需要调整输入格式:将集群vnet_enabled设为false时自动走kubenet网络方案,设为true并补全vnet、子网相关参数后,自动走Azure CNI网络方案
注:示例tfvars中
objectID= ["*********]缺少闭合双引号,实际使用时请补全,否则会触发HCL语法错误。
内容的提问来源于stack exchange,提问作者Prabhin
相关产品推荐
相关产品推荐

