node.js - 使用 Node.js 的 Cloud Scheduler API 客户端调用 runJob() 时出现 PERMISSION_DENIED 错误
问题描述
我有一个计划的 Firebase Cloud Function 每天运行:
const doSomething = functions.region("europe-west1").pubsub
.schedule("0 0 * * *").onRun(
....
)
这工作正常,作业出现在 Cloud Schedule 控制台中。但我也想在任意时间从另一个应用程序运行相同的功能,使用 Node.js 的 Cloud Scheduler API 客户端 (@google-cloud/scheduler) 上的runJob()方法。这是应该强制作业运行的代码:
const { CloudSchedulerClient } = require('@google-cloud/scheduler');
const client = new CloudSchedulerClient();
const jobId = "firebase-schedule-doSomething-europe-west1";
const job = client.jobPath(projectId, "europe-west1", jobId);
const request = { name: job }
await client.runJob(request);
运行前面的代码时,我收到以下错误:
Error: 7 PERMISSION_DENIED: The principal (user or service account) lacks IAM permission "cloudscheduler.jobs.run" for the resource "projects/myfirstproject/locations/europe-west1/jobs/firebase-schedule-doSomething-europe-west1" (or the resource may not exist).
at Object.callErrorFromStatus (/Users/gparis/myservice/node_modules/@grpc/grpc-js/build/src/call.js:31:26)
at Object.onReceiveStatus (/Users/gparis/myservice/node_modules/@grpc/grpc-js/build/src/client.js:179:52)
at Object.onReceiveStatus (/Users/gparis/myservice/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:336:141)
at Object.onReceiveStatus (/Users/gparis/myservice/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:299:181)
at /Users/gparis/myservice/node_modules/@grpc/grpc-js/build/src/call-stream.js:145:78
at processTicksAndRejections (node:internal/process/task_queues:78:11)
....
在 Cloud Console 的“服务帐号日志”中,我看到以下错误:
2021-09-22T15:09:23.523080936Z Cloud Scheduler API RunJob europe-west1:firebase-schedule-doSomething-europe-west1 firebase-adminsdk-xxxxx@myproject.iam.gserviceaccount.com
我认为我的服务帐户具有 Google 为 Cloud Scheduler 提供的角色授权。我是否缺少能够从 API 客户端运行这个预定的云功能的东西?
解决方案
推荐阅读
- php - 将如何包装 Wordpress 的 -dynamic_sidebar 输出的每个小部件?
- javascript - 如何从 AngularJS 调用 PHP 文件
- laravel - 在laravel中注册用户时如何将用户ID和角色ID保存在用户角色表中?
- ngrx - 如何在ngrx效果中操作数据并将其作为有效负载返回到操作?
- mysql - 如何避免基于数据库中陈旧数据的最终用户操作
- azure-sql-managed-instance - 如何在 Azure SQL 托管实例上查找数据库的最早还原点
- python - TeamCity - 根据先前调用脚本的返回值在构建步骤中设置参数
- python - 使用自定义索引重新分区 Dask Dataframe
- c++ - 将指针作为参数传递给函数
- button - Pluguins.Forms.Button.Circle 点击问题