如何通过GCP Python客户端库获取单个服务账号关联的多个GCP项目列表?
解决服务账号关联项目的查询问题
嘿,我懂你现在的困惑——你把同一个服务账号关联到了项目A和B,但从项目B生成的credentials.json里只有项目B的信息,运行代码也只显示项目B,这其实是正常的,我来给你拆解问题,再告诉你怎么正确查询所有关联项目:
为什么credentials.json里只有项目B的信息?
服务账号的密钥文件(credentials.json)是从特定项目创建的,所以它只会包含该项目的元数据(比如项目ID、名称),但这并不影响服务账号本身在其他项目的权限——因为跨项目的权限是通过在每个项目的IAM中给服务账号绑定角色实现的,这些权限信息不会存在密钥文件里。
你之前的代码里google.auth.default()返回的project变量,只是这个密钥文件创建时关联的默认项目(也就是项目B),它不会返回所有服务账号有权访问的项目,这就是为什么你只能看到项目B的原因。
怎么查询服务账号关联的所有项目?
要找出这个服务账号有权访问的所有项目,你需要查询各个项目的IAM政策,看看哪些项目给这个服务账号绑定了角色。下面给你两种可行的方法:
方法一:用gcloud命令行工具(简单直接)
- 首先用你的密钥文件激活服务账号:
gcloud auth activate-service-account --key-file=c:\test\credentials.json - 先列出你有权访问的所有项目:
gcloud projects list - 然后逐个查询每个项目的IAM政策,过滤出该服务账号的绑定记录(把
[SERVICE_ACCOUNT_EMAIL]换成你服务账号的邮箱,比如xxx@xxx.iam.gserviceaccount.com):
如果想批量查询所有项目,可以用循环脚本(比如bash或PowerShell),遍历gcloud projects get-iam-policy [PROJECT_ID] --flatten="bindings[].members" --format='table(bindings.role,bindings.members)' | grep "[SERVICE_ACCOUNT_EMAIL]"gcloud projects list返回的项目ID逐个执行上面的命令。
方法二:用代码通过IAM API查询(自动化查询)
这种方法适合你想在代码里自动获取所有关联项目的场景,步骤如下:
- 先安装需要的依赖包:
pip install google-cloud-iam google-cloud-resource-manager - 然后用下面的代码查询:
这段代码会遍历所有你有权访问的项目,检查每个项目的IAM政策,输出服务账号在该项目中拥有的角色。import os from google.auth import default from google.cloud import iam_v1 from google.cloud import resource_manager_v3 # 设置凭证路径 credential_path = r'c:\test\credentials.json' os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = credential_path # 获取当前服务账号的邮箱 credentials, _ = default() service_account_email = credentials.service_account_email # 初始化资源管理器客户端,获取所有可访问的项目 rm_client = resource_manager_v3.ProjectsClient() projects = rm_client.list_projects() # 初始化IAM客户端,查询每个项目的IAM政策 iam_client = iam_v1.IamClient() print(f"服务账号 {service_account_email} 关联的项目及角色:") for project in projects: project_id = project.project_id try: # 获取项目的IAM政策 policy = iam_client.get_iam_policy(request={"resource": f"projects/{project_id}"}) # 遍历所有绑定,找到包含当前服务账号的记录 for binding in policy.bindings: if service_account_email in binding.members: print(f"- 项目ID: {project_id},项目名称: {project.name},角色: {binding.role}") except Exception as e: # 如果没有权限查看该项目的IAM政策,会抛出异常,直接跳过 continue
总结一下
- 密钥文件
credentials.json只记录创建它的项目信息,不存储跨项目权限; google.auth.default()返回的是默认项目,不是所有关联项目;- 要查询所有关联项目,需要通过gcloud命令或IAM API查询各个项目的IAM绑定情况。
内容的提问来源于stack exchange,提问作者sudhar chrome
相关产品推荐
相关产品推荐

