Terraform跨账号批量授予GCP角色的资源配置问题
Terraform跨账号批量授予GCP角色的资源配置问题
嗨,我明白你现在的困扰——google_project_iam_member要求role必须是单个字符串,但你的本地变量里roles是列表,直接赋值肯定会报错对吧?别担心,用flatten函数就能完美解决这个问题,咱们一步步来调整:
首先,先把本地变量里的结构处理一下,把每个服务账号的每个角色都拆成独立的条目。我先修正你原来的jsondecode写法(原来的写法有点小问题,得用正确的JSON字符串格式),然后新增一个扁平化后的本地变量:
locals { cross_account_roles = jsondecode(<<EOF [ { "sa_name" : "admin-sa", "from_project_id": "projectA", "to_project_id": "projectB", "roles": ["roles/storageAdmin", "roles/computeAdmin"] }, { "sa_name" : "workshop-sa", "from_project_id": "projectC", "to_project_id": "projectB", "roles": ["roles/storageAdmin"] } ] EOF ) # 核心:把每个服务账号的每个角色拆成单独的条目 flattened_cross_account_roles = flatten([ for sa_entry in local.cross_account_roles : [ for single_role in sa_entry.roles : { sa_name = sa_entry.sa_name from_project_id = sa_entry.from_project_id to_project_id = sa_entry.to_project_id role = single_role } ] ]) }
接下来,修改你的google_project_iam_member资源配置,用这个扁平化后的集合来做for_each,而且要生成唯一的键(避免资源实例重复):
resource "google_project_iam_member" "cross_account_roles" { # 用服务账号名、项目ID和角色的组合生成唯一键,确保每个实例不重复 for_each = { for entry in local.flattened_cross_account_roles : "${entry.sa_name}-${entry.from_project_id}-${entry.to_project_id}-${entry.role}" => entry } project = each.value.to_project_id role = each.value.role member = "serviceAccount:${each.value.sa_name}@${each.value.from_project_id}.iam.gserviceaccount.com" }
这样调整后,每个服务账号的每个角色都会生成一个独立的google_project_iam_member资源实例,完全符合GCP IAM资源的要求——比如admin-sa会生成两个实例,分别绑定roles/storageAdmin和roles/computeAdmin到projectB,workshop-sa则生成一个实例绑定roles/storageAdmin到projectB。
简单说下原理:flatten函数在这里把原来的二维结构(服务账号列表 -> 每个账号的角色列表)转换成了一维的、每个条目对应一个角色的列表,这样for_each就能遍历每个单独的角色绑定需求,生成正确的资源啦。
备注:内容来源于stack exchange,提问作者Ajay k
相关产品推荐
相关产品推荐

