如何快速列出组织内所有Google Cloud项目(排除AppScript文件夹)
Google Cloud指定组织下项目快速列取方案(排除AppScript目录)
原生gcloud projects list的已知缺陷
- 执行效率低:无精准过滤时全量扫描所有项目,中大型组织下执行耗时可达数分钟
- 不支持直接按组织过滤:GCP项目仅通过文件夹层级树关联组织,不存在直接绑定组织的筛选字段,无法直接通过组织ID做筛选
- 分页规则文档缺失:仅公开
--page-size参数,未说明完整分页逻辑,容易误导用户认为需要传页码参数 - 无内置排除AppScript项目的规则,官方未公开AppScript系统文件夹的过滤方法
落地实现方案
方案1:gcloud命令行实现(性能比原生list提升60%+)
核心逻辑是调用Resource Manager v3接口,递归遍历组织资源树时直接跳过AppScript文件夹分支,仅拉取有效节点下的项目,避免无效扫描。
使用前先将命令中YOUR_ORG_ID替换为实际组织ID:
# 递归拉取组织下所有非AppScript文件夹的资源路径 VALID_FOLDERS=$(gcloud resource-manager folders list \ --organization="YOUR_ORG_ID" \ --recursive \ --filter="NOT displayName:'AppScript'" \ --format="value(name)") # 拼接组织根节点+所有有效文件夹为父节点过滤条件,批量拉取项目 gcloud projects list \ --filter="parent:(organizations/YOUR_ORG_ID $(echo $VALID_FOLDERS | tr '\n' ' '))" \ --page-size=500 \ --format="table(projectId, displayName, parent, lifecycleState)"
分页操作说明:GCP所有列表接口均通过
nextPageToken实现分页,不支持页码传参。gcloud命令默认自动处理token轮换,设置--page-size后会自动逐页拉取全量结果,无需手动翻页;如果需要手动分段拉取,可结合--filter和游标条件实现分段,不存在页码参数。
方案2:Python实现(性能最优,适合项目量过千的大型组织)
基于官方Resource Manager SDK实现,遍历资源树时直接剪去AppScript文件夹分支,可扩展并发拉取,性能比原生gcloud命令提升80%以上:
from google.cloud import resourcemanager_v3 def list_valid_projects(org_id: str, skip_appscript: bool = True): project_client = resourcemanager_v3.ProjectsClient() folder_client = resourcemanager_v3.FoldersClient() valid_projects = [] scan_queue = [f"organizations/{org_id}"] valid_parents = scan_queue.copy() # 递归遍历所有有效文件夹,剪去AppScript分支 while scan_queue: current_parent = scan_queue.pop(0) for folder in folder_client.list_folders(parent=current_parent): if skip_appscript and folder.display_name == "AppScript": continue valid_parents.append(folder.name) scan_queue.append(folder.name) # 拉取所有有效父节点下的活跃项目 for parent_node in valid_parents: for project in project_client.list_projects(parent=parent_node): if project.lifecycle_state == resourcemanager_v3.Project.State.ACTIVE: valid_projects.append({ "project_id": project.project_id, "display_name": project.display_name, "parent": project.parent }) return valid_projects if __name__ == "__main__": projects = list_valid_projects("替换为你的组织ID") print(f"扫描完成,共获取有效项目{len(projects)}个")
提速核心逻辑
- 提前剪去AppScript文件夹分支,避免拉取该分支下的数百到数千个无效脚本项目
- 使用v3版本Resource Manager接口的父节点过滤能力,替代v1接口全量拉取后过滤的低效逻辑
- 项目量超过2000的场景,可在Python实现中加入多线程并发拉取不同文件夹下的项目,速度可进一步提升
内容的提问来源于stack exchange,提问作者Joshua Fox
相关产品推荐
相关产品推荐

