我正在关注Creating HTTP Target tasks guide
当我运行下面发布的代码时,出现此错误:

cloudtasks.CreateTask: rpc error: code = PermissionDenied
desc = The principal (user or service account)
lacks IAM permission "cloudtasks.tasks.create" for the resource
 "projects/my_project/locations/europe-west1/queues/my_queue"
(or the resource may not exist).

我已经使用gcloud auth login [email protected]登录了。
[email protected]具有由我的自定义云任务角色设置的以下权限:
  • cloudtasks.locations.get
  • cloudtasks.locations.list
  • cloudtasks.queues.get
  • cloudtasks.queues.list
  • cloudtasks.tasks.create
  • cloudtasks.tasks.delete
  • cloudtasks.tasks.fullView
  • cloudtasks.tasks.get
  • cloudtasks.tasks.list
  • cloudtasks.tasks.run

  • 我不明白我还要检查什么?

    main.go
    // Run `PROJECT_ID=my_project QUEUE_ID=my_queue go run main.go`
    package main
    
    import (
      "context"
      "fmt"
      "os"
    
      cloudtasks "cloud.google.com/go/cloudtasks/apiv2"
      taskspb "google.golang.org/genproto/googleapis/cloud/tasks/v2"
    )
    
    var (
      locationID = "europe-west1"
      url        = "example.com/callback"
      message    = "testing"
    )
    
    func main() {
      projectID := os.Getenv("PROJECT_ID")
      queueID := os.Getenv("QUEUE_ID")
    
      task, err := createHTTPTask(projectID, locationID, queueID, url, message)
      if err != nil {
        fmt.Println(err)
      }
      fmt.Println(task)
    }
    
    // createHTTPTask creates a new task with a HTTP target then adds it to a Queue.
    func createHTTPTask(projectID, locationID, queueID, url, message string) (*taskspb.Task, error) {
      // Create a new Cloud Tasks client instance.
      // See https://godoc.org/cloud.google.com/go/cloudtasks/apiv2
      ctx := context.Background()
      client, err := cloudtasks.NewClient(ctx)
      if err != nil {
        return nil, fmt.Errorf("NewClient: %v", err)
      }
      // Build the Task queue path.
      queuePath := fmt.Sprintf("projects/%s/locations/%s/queues/%s", projectID, locationID, queueID)
      // Build the Task payload.
      // https://godoc.org/google.golang.org/genproto/googleapis/cloud/tasks/v2#CreateTaskRequest
      req := &taskspb.CreateTaskRequest{
        Parent: queuePath,
        Task: &taskspb.Task{
          // https://godoc.org/google.golang.org/genproto/googleapis/cloud/tasks/v2#HttpRequest
          MessageType: &taskspb.Task_HttpRequest{
            HttpRequest: &taskspb.HttpRequest{
              HttpMethod: taskspb.HttpMethod_POST,
              Url:        url,
            },
          },
        },
      }
      // Add a payload message if one is present.
      req.Task.GetHttpRequest().Body = []byte(message)
      createdTask, err := client.CreateTask(ctx, req)
      if err != nil {
        return nil, fmt.Errorf("cloudtasks.CreateTask: %v", err)
      }
      return createdTask, nil
    }
    

    Cloud Tasks API 已启用。

    最佳答案

    在过去的几天里,我一直遇到同样的问题,并已解决。我用来创建API客户端和创建任务的库所使用的凭据与我预期的不同。

    对于那些使用“应用程序默认凭据”或至少让客户端自动找到凭据的用户,请查看以下页面:https://cloud.google.com/docs/authentication/production#finding_credentials_automatically

    我创建了一个具有所有正确角色的服务帐户,并假定API客户端正在使用该服务帐户。原来我没有传递密钥文件,因此它使用的是“应用程序默认凭据”。对于我的用例,“应用程序默认凭据”是指App Engine默认服务帐户。当我向API客户端提供用于自定义服务帐户的密钥文件时,它就可以工作。

    10-02 09:35