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

使用Golang调用GCP API列出组织项目遇权限问题求助

问题

我正在学习Go语言,首个目标是实现gcloud projects list的API等效功能,列出GCP组织内所有项目,后续计划基于此实现「当Compute Engine标签更新时自动创建机器镜像」的功能。
我使用了Google API文档提供的模板代码,但多处TODO未完成,调用时返回PermissionDenied desc = The caller does not have permission错误。已配置Google应用默认凭据,能正常调用其他API列出计算实例,需要补全代码并解决权限问题。

完整实现代码

package main

import (
	"fmt"
	resourcemanager "cloud.google.com/go/resourcemanager/apiv3"
	"context"
	"google.golang.org/api/iterator"
	resourcemanagerpb "google.golang.org/genproto/googleapis/cloud/resourcemanager/v3"
)

func main() {
	ctx := context.Background()
	// 初始化Projects客户端
	c, err := resourcemanager.NewProjectsClient(ctx)
	if err != nil {
		fmt.Printf("创建客户端失败: %v\n", err)
		return
	}
	defer c.Close()

	// 替换为你的GCP组织ID,格式为"organizations/1234567890"
	orgID := "organizations/你的组织ID"
	req := &resourcemanagerpb.ListProjectsRequest{
		Parent: orgID,
		// 可选:过滤项目状态,比如只显示ACTIVE状态的项目
		Filter: "state:ACTIVE",
	}

	it := c.ListProjects(ctx, req)
	for {
		resp, err := it.Next()
		if err == iterator.Done {
			break
		}
		if err != nil {
			fmt.Printf("遍历项目失败: %v\n", err)
			return
		}
		// 输出项目关键信息,等效于gcloud projects list的输出
		fmt.Printf("项目ID: %s\t项目名称: %s\t项目状态: %s\n",
			resp.ProjectId, resp.DisplayName, resp.State.String())
	}
}

权限问题解决建议

  • 添加必要IAM角色:你的应用默认凭据对应的身份(服务账号/用户账号)缺少资源管理器API的访问权限,需添加以下角色之一:
    • roles/resourcemanager.projectViewer:允许查看项目列表
    • roles/resourcemanager.organizationViewer:允许查看组织内所有资源(含项目)
    • roles/editor或roles/owner:权限范围更广(生产环境不推荐)
  • 验证权限配置:
    1. 运行gcloud auth list查看当前活跃凭据对应的身份
    2. 进入GCP控制台IAM页面,找到该身份,确认已添加上述角色
    3. 若为服务账号,需确保权限绑定在组织级或覆盖所有目标项目的层级
  • 刷新凭据缓存:刚修改IAM权限后,运行gcloud auth application-default login重新生成应用默认凭据,避免旧缓存影响
  • 检查API启用状态:确认「Cloud Resource Manager API」已在GCP组织中启用(控制台API库搜索启用)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 19:20:32