使用Python API获取Google Cloud项目用户及权限返回空的原因及解决方法
问题分析与解决方案
嘿,我立刻就发现问题出在哪了——你调用了错误的IAM API!
为什么projects.roles/list返回空对象{}?
你混淆了两个完全不同的IAM接口:
- 你用
gcloud projects get-iam-policy MY_PROJECT拿到的是项目的完整IAM权限绑定清单(也就是用户/服务账号和对应角色的映射关系),这个命令背后调用的是projects.getIamPolicyAPI。 - 而你实际调用的
projects.roles/listAPI,它的作用是列出项目中你自定义的IAM角色。如果你的项目从来没创建过自定义角色,这个API返回空对象{}是完全正常的,但这根本不是你要的用户权限数据!
正确的实现方式
1. 调用正确的API获取权限绑定
你需要使用projects.getIamPolicy API来获取项目的IAM政策。这里给你一个curl调用的示例:
curl -H "Authorization: Bearer $(gcloud auth print-access-token)" \ "https://iam.googleapis.com/v1/projects/MY_PROJECT:getIamPolicy" \ -X POST -d '{"options": {"requestedPolicyVersion": 3}}'
这个请求会返回和gcloud命令一致的结果,包含所有成员(用户、服务账号、群组等)以及他们对应的角色权限。
2. 其他可行的实现方式
除了命令行和API,还有几种实用的方法可以获取项目的用户权限:
- Cloud Console可视化查看:直接进入项目的「IAM与管理员」→「IAM」页面,就能直观看到所有成员的角色,还能点击导出按钮获取CSV格式的权限清单。
- 官方客户端SDK:用你熟悉的编程语言调用Google Cloud官方SDK,比如Python的示例代码:
from google.cloud import iam_v2 client = iam_v2.IamClient() request = iam_v2.GetIamPolicyRequest( resource="projects/MY_PROJECT", options=iam_v2.GetPolicyOptions(requested_policy_version=3), ) response = client.get_iam_policy(request=request) # 打印所有权限绑定关系 for binding in response.bindings: print(f"角色: {binding.role}, 成员: {binding.members}")
- Terraform数据源:如果用Terraform管理基础设施,可以通过
google_project_iam_policy数据源获取IAM政策:
data "google_project_iam_policy" "project_permissions" { project = "MY_PROJECT" } output "all_iam_bindings" { value = data.google_project_iam_policy.project_permissions.bindings }
内容的提问来源于stack exchange,提问作者Swati Sneha
相关产品推荐
相关产品推荐

