cloudtasks.CreateTask завершается ошибкой: `отсутствует разрешение IAM" cloudtasks.tasks.create "`, хотя моя учетная запись имеет такое разрешение - PullRequest
0 голосов
/ 25 февраля 2020

Я следую инструкциям Создание цели HTTP . Когда я запускаю приведенный ниже код, я получаю эту ошибку:

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 my@email.com. my@email.com имеет следующие разрешения, установленные моей пользовательской ролью облачной задачи:

  • 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
}

API облачных задач включен.

1 Ответ

1 голос
/ 27 февраля 2020

Последние пару дней у меня была такая же проблема, и я понял это. Библиотека, которую я использовал для создания клиента API и создания задачи, использовала учетные данные, отличные от ожидаемых.

Для тех, кто использует «учетные данные приложения по умолчанию» или, по крайней мере, разрешает клиенту автоматически находить учетные данные, посмотрите на эту страницу: https://cloud.google.com/docs/authentication/production#finding_credentials_automatically

Я создал учетную запись службы со всеми необходимыми ролями и предполагал, что клиент API использует учетную запись службы. Оказывается, я не передавал файл ключа, и поэтому он использовал «учетные данные приложения по умолчанию». В моем случае «учетные данные приложения по умолчанию» относятся к учетной записи службы App Engine по умолчанию. Когда я предоставил клиенту API файл ключа для своей учетной записи настраиваемой службы, он работал.

...