You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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命令行工具(简单直接)

  1. 首先用你的密钥文件激活服务账号:
    gcloud auth activate-service-account --key-file=c:\test\credentials.json
    
  2. 先列出你有权访问的所有项目:
    gcloud projects list
    
  3. 然后逐个查询每个项目的IAM政策,过滤出该服务账号的绑定记录(把[SERVICE_ACCOUNT_EMAIL]换成你服务账号的邮箱,比如xxx@xxx.iam.gserviceaccount.com):
    gcloud projects get-iam-policy [PROJECT_ID] --flatten="bindings[].members" --format='table(bindings.role,bindings.members)' | grep "[SERVICE_ACCOUNT_EMAIL]"
    
    如果想批量查询所有项目,可以用循环脚本(比如bash或PowerShell),遍历gcloud projects list返回的项目ID逐个执行上面的命令。

方法二:用代码通过IAM API查询(自动化查询)

这种方法适合你想在代码里自动获取所有关联项目的场景,步骤如下:

  1. 先安装需要的依赖包:
    pip install google-cloud-iam google-cloud-resource-manager
    
  2. 然后用下面的代码查询:
    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
    
    这段代码会遍历所有你有权访问的项目,检查每个项目的IAM政策,输出服务账号在该项目中拥有的角色。

总结一下

  • 密钥文件credentials.json只记录创建它的项目信息,不存储跨项目权限;
  • google.auth.default()返回的是默认项目,不是所有关联项目;
  • 要查询所有关联项目,需要通过gcloud命令或IAM API查询各个项目的IAM绑定情况。

内容的提问来源于stack exchange,提问作者sudhar chrome

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 12:17:52