0

我的应用程序很小:

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,它可以正常工作。

我究竟做错了什么?

4

3 回答 3

1

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

对于权限compute.urlMaps.list,3 个策划角色包含它

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

此外,不要忘记授予角色roles/iam.serviceAccountUser

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

于 2019-12-01T19:37:50.873 回答
1

从 GCP ,我猜还需要启用 servceAccountUser 角色

角色/ compute.admin 完全控制所有 Compute Engine 资源。

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

于 2019-12-01T14:36:46.287 回答
1

我的同事发现了这个问题:我把项目名称 my-prj写错了。A404可能帮助我更快地发现问题。

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

于 2019-12-02T08:27:37.613 回答