如何使用Terraform双map实现GCP项目IAM角色批量绑定
GCP项目批量IAM角色绑定Terraform实现方案
Terraform 不支持资源块内直接嵌套 for_each,你可以先将「项目遍历」和「角色绑定遍历」两个维度的组合做扁平化处理,生成一个元素唯一的单层 map,再传入资源的 for_each 即可实现需求,该方案完全适配你已定义的变量结构。
具体实现步骤
- 新增
locals块生成扁平化的所有绑定组合
locals { # 遍历生成所有 项目-角色-成员 的唯一绑定组合 project_role_bindings = merge([ # 第一层遍历所有GCP项目 for project_key, project_info in var.project_details : { # 第二层遍历所有待绑定的角色 for role_key, role_info in var.role_bind : # 第三层遍历角色下的所有成员,生成唯一key避免重复 "${project_key}-${role_key}-${replace(member, ":", "-")}" => { project_id = project_info.project_id role = role_info.name member = member } for member in role_info.member } ]...) }
上面的逻辑通过三层遍历把所有需要绑定的组合全部展开,key使用「项目标识+角色标识+成员标识」的组合保证全局唯一,也避免了成员列表顺序变化导致资源重建的问题。
- 调用
google_project_iam_member资源批量创建绑定
resource "google_project_iam_member" "project_common_bind" { for_each = local.project_role_bindings project = each.value.project_id role = each.value.role member = each.value.member }
方案优势
- 不需要修改原有
project_details、role_bind变量定义 - 后续新增项目、新增角色、新增绑定成员时,仅需要修改变量值即可,无需调整资源逻辑
- 每个绑定资源对应唯一键,支持单独对某一条绑定做增删改操作
提示:如果需要过滤个别项目不需要绑定通用角色,只需要在第一层
for表达式里加if判断条件即可实现自定义过滤。
内容的提问来源于stack exchange,提问作者Ayan
相关产品推荐
相关产品推荐

