GCP 使用 Golang API 列出项目

我正在努力学习更多 Go,我的第一个计划是列出我们 GCP 组织中的所有项目(API 相当于gcloud projects list)。稍后我想以此为跳板,在更新 Compute Engine 标签时创建机器映像。


我正在使用 Google API 文档中的这个样板:


“ListProjects 列出了指定文件夹或组织资源的直接子项目。”


package main


import (

        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()

        c, err := resourcemanager.NewProjectsClient(ctx)

        if err != nil {

                // TODO: Handle error.

        }

        defer c.Close()


        req := &resourcemanagerpb.ListProjectsRequest{

                // TODO: Fill request struct fields.

                // See https://pkg.go.dev/google.golang.org/genproto/googleapis/cloud/resourcemanager/v3#ListProjectsRequest.

        }

        it := c.ListProjects(ctx, req)

        for {

                resp, err := it.Next()

                if err == iterator.Done {

                        break

                }

                if err != nil {

                        // TODO: Handle error.

                }

                // TODO: Use resp.

                _ = resp

        }

}

我意识到这里有我没有完成的“TODO”部分。有人可以帮助建议我如何使用这个样板并获得一个简单的项目列表吗?感觉我缺少某种形式来识别我的组织或项目,但由于我想要整个项目列表,似乎我没有在 API 调用中传达我的组织 ID?


现在我收到“PermissionDenied desc = The caller does not have permission”。但是,我知道我有 Google Application Default 凭据设置,因为我可以在 go 中执行另一个 API 调用以列出计算实例。


斯蒂芬大帝
浏览 95回答 1
1回答

缥缈止盈

将APIs Explorer用于 Cloud Resource Manager API v3projects.searchORGANIZATION=[[YOUR-ORG]]PROJECT=[[YOUR-PROJECT]] # Service Accounts are owned by ProjectsACCOUNT="tester"# Enable Cloud Resource Manager API in a Project# This Project will own the Service Account toogcloud services enable cloudresourcemanager.googleapis.com \--project=${PROJECT}# Create the Service Accountgcloud iam service-accounts create ${ACCOUNT} \--project=${PROJECT}EMAIL=${ACCOUNT}@${PROJECT}.iam.gserviceaccount.com # Create a Service Account Key locally# For testing purposes onlygcloud iam service-accounts keys create ${PWD}/${ACCOUNT}.json \--iam-account=${EMAIL} \--project=${PROJECT} # Ensure the Service Account can browse the Organization's resources gcloud organizations add-iam-policy-binding ${ORGANIZATION} \--role=roles/browser \--member=serviceAccount:${EMAIL} export GOOGLE_APPLICATION_CREDENTIALS=${PWD}/${ACCOUNT}.jsonexport ORGANIZATIONgo run .并且: main.go:package mainimport (    "context"    "fmt"    "log"    "os"    resourcemanager "cloud.google.com/go/resourcemanager/apiv3"    resourcemanagerpb "google.golang.org/genproto/googleapis/cloud/resourcemanager/v3"    "google.golang.org/api/iterator")func main() {    organization := os.Getenv("ORGANIZATION")    if organization == "" {        log.Fatalf("unable to obtain ORGANIZATION from the environment")    }    ctx := context.Background()    c, err := resourcemanager.NewProjectsClient(ctx)    if err != nil {        log.Fatal(err)    }    defer c.Close()    rqst := &resourcemanagerpb.SearchProjectsRequest{        Query: fmt.Sprintf("parent:organizations/%s", organization),    }    it := c.SearchProjects(ctx, rqst)    for {        resp, err := it.Next()        if err == iterator.Done {            break        }        if err != nil {            log.Fatal(err)        }        log.Println(resp.DisplayName)    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go