在Go应用程序中使用默认凭据时出现GCP权限问题

时间:2019-12-01 12:12:31

标签: go google-cloud-platform

我的应用程序很小:

import (
    "context"
    "fmt"
    "log"

    "google.golang.org/api/compute/v1"
)

func main() {
    ctx := context.Background()
    computeService, err := compute.NewService(ctx)
    urlMapCall := computeService.UrlMaps.List("my-prj")
    urlMaps, err := urlMapCall.Do()
    if err != nil {
        log.Println(err)
        return
    }
    for _, mp := range urlMaps.Items {
        fmt.Println(mp.Name)
    }
}

我得到了错误:

googleapi: Error 403: Required 'compute.urlMaps.list' permission for 'projects/my-prj', forbidden

我设置了环境变量GOOGLE_APPLICATION_CREDENTIALS=$HOME/.gcp/my-prj-aef233we.json。 JSON表示的服务帐户具有项目编辑器计算管理角色。

当我执行gcloud compute url-maps list时,它可以正常工作。

我在做什么错了?

3 个答案:

答案 0 :(得分:1)

在GCP中,还需要启用我猜的servceAccountUser角色

  

roles / compute.admin对Compute Engine所有资源的完全控制。

     

如果用户将要管理的虚拟机实例是   配置为作为服务帐户运行,您还必须授予   角色/iam.serviceAccountUser角色。

答案 1 :(得分:1)

使用gcloud命令进行测试时,很有可能您不是使用服务帐户而是使用个人帐户进行测试。这意味着您没有相同的权限级别,因此尊重所观察到的行为。执行gcloud config list以查看当前配置和用户。

对于权限compute.urlMaps.list,包含3个指定角色

roles/compute.viewer
roles/compute.networkViewer
roles/compute.instanceAdmin.v1

此外,别忘了授予角色roles/iam.serviceAccountUser

将其中之一添加到您的服务帐户中。

答案 2 :(得分:1)

我的同事发现了问题:我给项目名称 my-prj输入了错误的代码。 404可以帮助我更快地发现问题。

感谢其他答案,因为需要添加角色服务帐户用户