使用Golang API列出GCP项目。

huangapple go评论118阅读模式
英文:

GCP list projects wtih Golang API

问题

我正在尝试学习更多关于Go语言的知识,我的第一个程序是列出我们GCP组织中的所有项目(相当于gcloud projects list的API等效方式)。之后,我想利用这个程序来创建机器镜像,当计算引擎的标签更新时。

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

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

  1. package main
  2. import (
  3. resourcemanager "cloud.google.com/go/resourcemanager/apiv3"
  4. "context"
  5. "google.golang.org/api/iterator"
  6. resourcemanagerpb "google.golang.org/genproto/googleapis/cloud/resourcemanager/v3"
  7. )
  8. func main() {
  9. ctx := context.Background()
  10. c, err := resourcemanager.NewProjectsClient(ctx)
  11. if err != nil {
  12. // TODO: 处理错误。
  13. }
  14. defer c.Close()
  15. req := &resourcemanagerpb.ListProjectsRequest{
  16. // TODO: 填充请求结构体字段。
  17. // 参见 https://pkg.go.dev/google.golang.org/genproto/googleapis/cloud/resourcemanager/v3#ListProjectsRequest。
  18. }
  19. it := c.ListProjects(ctx, req)
  20. for {
  21. resp, err := it.Next()
  22. if err == iterator.Done {
  23. break
  24. }
  25. if err != nil {
  26. // TODO: 处理错误。
  27. }
  28. // TODO: 使用 resp。
  29. _ = resp
  30. }
  31. }

我意识到这里有一些未完成的"TODO"部分。有人可以帮忙建议如何使用这个样板代码来获取项目的简单列表吗?感觉我缺少一种方式来标识我的组织或项目,但由于我想要获取整个项目列表,似乎在API调用中没有传递我的组织ID?

目前我得到的错误是"PermissionDenied desc = The caller does not have permission"。然而,我知道我已经设置了Google应用程序默认凭据,因为我可以使用另一个Go API调用来列出计算实例。

英文:

I am trying to learn more Go, and my first program is to list all the projects in our GCP org (API equivalent of gcloud projects list). Later I want to take this as a springboard to create machine images when a Compute Engine label is updated.

I am using this boilplate from the Google API docs:

"ListProjects lists projects that are direct children of the specified folder or organization resource."

  1. package main
  2. import (
  3. resourcemanager "cloud.google.com/go/resourcemanager/apiv3"
  4. "context"
  5. "google.golang.org/api/iterator"
  6. resourcemanagerpb "google.golang.org/genproto/googleapis/cloud/resourcemanager/v3"
  7. )
  8. func main() {
  9. ctx := context.Background()
  10. c, err := resourcemanager.NewProjectsClient(ctx)
  11. if err != nil {
  12. // TODO: Handle error.
  13. }
  14. defer c.Close()
  15. req := &resourcemanagerpb.ListProjectsRequest{
  16. // TODO: Fill request struct fields.
  17. // See https://pkg.go.dev/google.golang.org/genproto/googleapis/cloud/resourcemanager/v3#ListProjectsRequest.
  18. }
  19. it := c.ListProjects(ctx, req)
  20. for {
  21. resp, err := it.Next()
  22. if err == iterator.Done {
  23. break
  24. }
  25. if err != nil {
  26. // TODO: Handle error.
  27. }
  28. // TODO: Use resp.
  29. _ = resp
  30. }
  31. }

I realize there are "TODO" pieces here that I don't have completed. Can someone help to suggest how I can take this boilplate and get a simple list of projects? It feels like I am lacking some form of identifying my org or my project, but since I want the entire list of projects, it seems like I am not conveying my org id in the API call?

For now I am getting "PermissionDenied desc = The caller does not have permission". However, I know that I have Google Application Default credentials setup because I can do another API call in go to list compute instances.

答案1

得分: 2

使用APIs Explorer来调用Cloud Resource Manager API v3的projects.search方法。

  1. ORGANIZATION=[[YOUR-ORG]]
  2. PROJECT=[[YOUR-PROJECT]] # Service Accounts are owned by Projects
  3. ACCOUNT="tester"
  4. # 在项目中启用Cloud Resource Manager API
  5. # 这个项目也将拥有Service Account
  6. gcloud services enable cloudresourcemanager.googleapis.com \
  7. --project=${PROJECT}
  8. # 创建Service Account
  9. gcloud iam service-accounts create ${ACCOUNT} \
  10. --project=${PROJECT}
  11. EMAIL=${ACCOUNT}@${PROJECT}.iam.gserviceaccount.com
  12. # 在本地创建Service Account Key
  13. # 仅用于测试目的
  14. gcloud iam service-accounts keys create ${PWD}/${ACCOUNT}.json \
  15. --iam-account=${EMAIL} \
  16. --project=${PROJECT}
  17. # 确保Service Account可以浏览组织的资源
  18. gcloud organizations add-iam-policy-binding ${ORGANIZATION} \
  19. --role=roles/browser \
  20. --member=serviceAccount:${EMAIL}
  21. export GOOGLE_APPLICATION_CREDENTIALS=${PWD}/${ACCOUNT}.json
  22. export ORGANIZATION
  23. go run .

还有:
main.go:

  1. package main
  2. import (
  3. "context"
  4. "fmt"
  5. "log"
  6. "os"
  7. resourcemanager "cloud.google.com/go/resourcemanager/apiv3"
  8. resourcemanagerpb "google.golang.org/genproto/googleapis/cloud/resourcemanager/v3"
  9. "google.golang.org/api/iterator"
  10. )
  11. func main() {
  12. organization := os.Getenv("ORGANIZATION")
  13. if organization == "" {
  14. log.Fatalf("无法从环境中获取ORGANIZATION")
  15. }
  16. ctx := context.Background()
  17. c, err := resourcemanager.NewProjectsClient(ctx)
  18. if err != nil {
  19. log.Fatal(err)
  20. }
  21. defer c.Close()
  22. rqst := &resourcemanagerpb.SearchProjectsRequest{
  23. Query: fmt.Sprintf("parent:organizations/%s", organization),
  24. }
  25. it := c.SearchProjects(ctx, rqst)
  26. for {
  27. resp, err := it.Next()
  28. if err == iterator.Done {
  29. break
  30. }
  31. if err != nil {
  32. log.Fatal(err)
  33. }
  34. log.Println(resp.DisplayName)
  35. }
  36. }

以上是要翻译的内容。

英文:

Using APIs Explorer for Cloud Resource Manager API v3 projects.search

  1. ORGANIZATION=[[YOUR-ORG]]
  2. PROJECT=[[YOUR-PROJECT]] # Service Accounts are owned by Projects
  3. ACCOUNT="tester"
  4. # Enable Cloud Resource Manager API in a Project
  5. # This Project will own the Service Account too
  6. gcloud services enable cloudresourcemanager.googleapis.com \
  7. --project=${PROJECT}
  8. # Create the Service Account
  9. gcloud iam service-accounts create ${ACCOUNT} \
  10. --project=${PROJECT}
  11. EMAIL=${ACCOUNT}@${PROJECT}.iam.gserviceaccount.com
  12. # Create a Service Account Key locally
  13. # For testing purposes only
  14. gcloud iam service-accounts keys create ${PWD}/${ACCOUNT}.json \
  15. --iam-account=${EMAIL} \
  16. --project=${PROJECT}
  17. # Ensure the Service Account can browse the Organization's resources
  18. gcloud organizations add-iam-policy-binding ${ORGANIZATION} \
  19. --role=roles/browser \
  20. --member=serviceAccount:${EMAIL}
  21. export GOOGLE_APPLICATION_CREDENTIALS=${PWD}/${ACCOUNT}.json
  22. export ORGANIZATION
  23. go run .

And:
main.go:

  1. package main
  2. import (
  3. "context"
  4. "fmt"
  5. "log"
  6. "os"
  7. resourcemanager "cloud.google.com/go/resourcemanager/apiv3"
  8. resourcemanagerpb "google.golang.org/genproto/googleapis/cloud/resourcemanager/v3"
  9. "google.golang.org/api/iterator"
  10. )
  11. func main() {
  12. organization := os.Getenv("ORGANIZATION")
  13. if organization == "" {
  14. log.Fatalf("unable to obtain ORGANIZATION from the environment")
  15. }
  16. ctx := context.Background()
  17. c, err := resourcemanager.NewProjectsClient(ctx)
  18. if err != nil {
  19. log.Fatal(err)
  20. }
  21. defer c.Close()
  22. rqst := &resourcemanagerpb.SearchProjectsRequest{
  23. Query: fmt.Sprintf("parent:organizations/%s", organization),
  24. }
  25. it := c.SearchProjects(ctx, rqst)
  26. for {
  27. resp, err := it.Next()
  28. if err == iterator.Done {
  29. break
  30. }
  31. if err != nil {
  32. log.Fatal(err)
  33. }
  34. log.Println(resp.DisplayName)
  35. }
  36. }

huangapple
  • 本文由 发表于 2022年9月13日 08:10:30
  • 转载请务必保留本文链接:https://go.coder-hub.com/73696396.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定