Удаление облачной задачи из облачных функций - PullRequest
0 голосов
/ 02 марта 2020

Я пытаюсь удалить облачную задачу Google с помощью облачной функции. Это код, который, как мне кажется, мне нужен на основе документов Google.

export const deleteHearingReminder = functions.firestore
  .document('Hearings/{HearingID}/Accepted/{AcceptedId}')
  .onUpdate(async change => {
    const dataBefore = change.before.data() as data;
    const dataAfter = change.before.data() as data;

    if (dataBefore === dataAfter) {
      console.log("Text didn't change");
      return null;
    }

    const taskID ={ name : dataAfter.taskId };

    const client = new CloudTasksClient();

    const [response] = await client.deleteTask(taskID);

    console.log(`delete task ${response.name}`);

    return Promise.resolve({ task: response.name });
  });

Когда вызывается эта функция, я получаю сообщение об ошибке

Error: 7 PERMISSION_DENIED: Permission denied on resource project 6cDNgaqLniz6kHGonePh.

, где 6cDN ... - это идентификатор задачи, которую я пытаюсь удалить, поэтому мои вопросы: я не предоставляю задачи Google с достаточно информации, чтобы удалить эту задачу, что я получаю ошибку PERMISSION_DENIED? Кроме того, если есть больше информации, я должен предоставить, каковы соответствующие имена полей, потому что из того, что я вижу в документах Google, deleteTask берет только «имя». Любые предложения приветствуются, спасибо.

Я действительно ценю всю помощь, поэтому мой код выглядит следующим образом.

const request = {
        name: `projects/${project}/locations/${location}/queues/${default_queue}/tasks/${dataAfter.taskId}`,
    };
    taskClient.deleteTask(request).catch(error => {
        console.error(`There was an error ${error}`);
    });

, и это работает, и это здорово. Спасибо, я все еще получаю ошибку в этом методе catch, хотя

5 NOT_FOUND: Requested entity was not found

Я проверял его несколько раз с единообразными результатами, если меня беспокоит об этом он, кажется, работает как ожидалось

Ответы [ 2 ]

0 голосов
/ 03 марта 2020

Для получения разрешения вам необходимо предоставить учетной записи службы использовать роль Cloud Tasks Delete на странице IAM

Однако вы по ошибке пытаетесь выполнить удаление задачи.

Вы можете см. здесь официальную документацию относительно удаления задач.

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

async function deleteQueue(
  project = 'my-project-id', // Your GCP Project id
  queue = 'my-appengine-queue', // Name of the Queue to delete
  location = 'us-central1' // The GCP region in which to delete the queue
) {
  // Imports the Google Cloud Tasks library.
  const cloudTasks = require('@google-cloud/tasks');

  // Instantiates a client.
  const client = new cloudTasks.CloudTasksClient();

  // Get the fully qualified path to the queue
  const name = client.queuePath(project, location, queue);

  // Send delete queue request.
  await client.deleteQueue({name});
  console.log(`Deleted queue '${queue}'.`);
}

const args = process.argv.slice(2);
deleteQueue(...args).catch(console.error);

Передаваемый аргумент должен быть именем задачи в следующем формате:

name=projects/[PROJECT_ID]/locations/[LOCATION]/queues/[QUEUE]/tasks/[TASK]

Здесь вы можете увидеть, как работает метод удаления задачи и что он ожидает получить.

  // Deletes a task.
  //
  // A task can be deleted if it is scheduled or dispatched. A task
  // cannot be deleted if it has completed successfully or permanently
  // failed.
  rpc DeleteTask(DeleteTaskRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = {
      delete: "/v2beta2/{name=projects/*/locations/*/queues/*/tasks/*}"
    };
    option (google.api.method_signature) = "name";
  }
0 голосов
/ 03 марта 2020

Вам необходимо назначить учетной записи службы облачных функций необходимые разрешения, чтобы удалить задачу. Предполагая, что вы используете облачную функцию с учетной записью службы PROJECT_ID@appspot.gserviceaccount.com as по умолчанию, просто предоставьте роль Cloud Tasks Task Deleter (Access to delete tasks) учетной записи службы.

Предоставление ролей учетным записям служб

...