Terraform中for_each与count无法同时使用的解决方案是什么
解决方案
核心逻辑是将环境判断规则嵌入for_each参数的输入值中,无需使用count即可同时满足按环境控制资源是否创建和批量遍历用户生成资源两个需求。
修改后的资源配置
resource "google_storage_bucket_iam_member" "user_email_access" { for_each = var.env == "stg" ? var.some_ext_users : {} provider = google-beta bucket = "my-bucketttt" role = "roles/storage.objectViewer" member = "user:${each.value.email_id}" }
原理解释
- 当
var.env的值为stg时,for_each接收完整的用户map变量,会为每一个用户生成对应的IAM权限资源,和原来的遍历逻辑完全一致 - 当
var.env的值不为stg时,for_each接收空map,Terraform不会创建任何该类型的资源实例,达到和原来count = 0完全相同的效果
适配项目ID等动态参数需求
如果需要根据环境拼接项目ID、桶名等参数,可以直接在资源属性中嵌入${var.env}变量即可,示例如下:
# 按规则拼接项目ID project = "my-project-${var.env}" # 按环境区分桶名 bucket = "my-business-bucket-${var.env}"
扩展场景适配
如果需要为stg和prd环境分别分配不同的用户权限,可以定义两套用户map变量,按环境选择对应的遍历对象即可:
# 变量定义示例 variable stg_ext_users { type = map(any) default = {} } variable prd_ext_users { type = map(any) default = {} } # for_each 配置示例 for_each = var.env == "stg" ? var.stg_ext_users : var.prd_ext_users
内容的提问来源于stack exchange,提问作者user6308605
相关产品推荐
相关产品推荐

