Terraform同时使用count与for_each报错,求解决方案
解决Terraform中count与for_each互斥的IAM角色分配问题
Terraform不允许在同一个资源块中同时使用count和for_each,这是两者的设计互斥性导致的。要给每个项目的服务账号批量分配多组IAM角色,你可以通过生成项目与角色的笛卡尔积,用for_each遍历所有组合来实现,具体代码如下:
修正后的代码示例
首先确保你的角色变量定义正常:
variable "sa_roles" { type = list(string) default = ["roles/run.developer", "roles/appengine.deployer"] }
然后修改IAM角色绑定的资源块:
resource "google_project_iam_member" "proj_sa_iam_roles" { # 生成项目与角色的所有组合,用唯一键标识每个绑定 for_each = { for pair in setproduct(module.app_projects, var.sa_roles) : "${pair[0].project_id}_${pair[1]}" => pair } project = each.value[0].project_id role = each.value[1] member = "serviceAccount:${each.value[0].service_account_email}" }
代码说明
setproduct(module.app_projects, var.sa_roles):生成所有项目与角色的组合(笛卡尔积),每个元素是包含项目对象和角色字符串的元组。${pair[0].project_id}_${pair[1]}:用项目ID加角色名作为for_each的唯一键,确保每个IAM绑定资源的唯一性。- 遍历过程中,
each.value[0]对应单个项目的输出(包含project_id和service_account_email),each.value[1]对应要分配的IAM角色。
这种方式会为每个项目的每个角色创建独立的google_project_iam_member资源,Terraform能准确追踪每个绑定的状态,避免批量操作带来的资源混乱。
内容的提问来源于stack exchange,提问作者display_name
相关产品推荐
相关产品推荐

