尝试运行 Cloud Run 作业时,Cloud Scheduler 的权限被拒绝

Posted

技术标签:

【中文标题】尝试运行 Cloud Run 作业时,Cloud Scheduler 的权限被拒绝【英文标题】:Cloud Scheduler has Permission Denied when attempting to run a Cloud Run job 【发布时间】:2021-10-15 04:18:57 【问题描述】:

我创建了一个简单的 Cloud Run 作业。我可以通过 curl 命令触发此代码:

curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" https://sync-<magic>.a.run.app

(显然其实是别的东西)

为 Ingress 配置 Cloud Run 以允许所有流量并且需要身份验证。

我遵循了这个文档:https://cloud.google.com/run/docs/triggering/using-scheduler

并创建了一个服务帐户,授予它 Cloud Run Invoker 角色,然后设置一个 HTTP 计划作业以获取我使用 CURL 测试过的相同 URL。我选择了添加 OIDC 令牌,并提供了上面创建的服务帐户和我在 curl 中使用的相同 URL。

当我尝试触发此作业时(或当它基于本机 cron 触发时)它失败并显示:

 "status": "PERMISSION_DENIED", "@type": "type.googleapis.com/google.cloud.scheduler.logging.AttemptFinished", "targetType": "HTTP", "jobName": "projects/<project>/locations/<region>/jobs/sync", "url": "https://sync-<magic>.a.run.app/" 

同样, 具有实际值。

我尝试使用 service-YOUR_PROJECT_NUMBER@gcp-sa-cloudscheduler.iam.gserviceaccount.com 并将 YOUR_PROJECT_NUMBER 适当更新为运行计划作业的服务帐户。它有同样的错误。

任何关于如何调试的建议将不胜感激!

【问题讨论】:

转到 Google Cloud Console -> Cloud Run。验证服务帐户是否已绑定到具有 Invoker 角色的应用程序。 您能否检查 Cloud Scheduler SA 服务帐户是否具有在您放入 Cloud Scheduler 配置的服务帐户上生成令牌的角色。角色是serviceAccountUser 谢谢约翰,我已经验证了这一点,但没有帮助。 Guillaume,我怎么知道 Cloud Scheduler 使用了哪个服务帐号? @guillaumeblaquiere 在我看来 Cloud Scheduler SA 是 service-YOUR_PROJECT_NUMBER@gcp-sa-cloudscheduler.iam.gserviceaccount.com。这不会显示在主 IAM 或服务屏幕中。这是你认为我应该检查的吗? 【参考方案1】:

这是我所做的,它完全解决了这个问题,现在我在通过Cloud Scheduler 作业 -

    在 Cloud run 上创建您的服务 - 我们称它为“hello”,并通过从 Permissions PRINCIPALS 列表中删除“allUsers”权限来确保它的安全 - 转到端点时应该会出错因此 - 错误:禁止 您的客户端无权从此服务器获取 URL /。 为云调度程序创建一个 IAM 服务帐户 - 我们称其为“cloud-scheduler”,您将获得以下信息:cloud-scheduler@project-ID.iam.gserviceaccount.com 现在是重要部分: 通过添加 - 让您的 SA 能够运行调度程序作业 Cloud Run Invoker 和 Cloud Scheduler Job Runner 权限 根据谷歌程序创建您的云调度程序作业并添加新的 SA: Auth 标头:添加 OIDC 令牌 服务帐号:cloud-scheduler@project-id.iam.gserviceaccount.com 观众:https://Service.url.from.cloud.run.service/ 向您的云运行服务添加一个额外的主体,让您的 SA 访问云运行调用程序

运行你的调度器,瞧——全是绿色的! 享受

【讨论】:

我没有授予 Cloud Scheduler Job Runner 权限,它也可以正常工作。【参考方案2】:

我尝试创建一个新的服务帐户,并为其赋予了云运行调用者角色。禁用 Cloud Scheduler API 并重新启用它。

唯一对我有用的是将 Auth 标头从 Add OIDC token 更改为 None。 由于某种原因,Cloud Scheduler 将 None 更改回 Add OIDC token 并触发云正常运行

【讨论】:

以上是关于尝试运行 Cloud Run 作业时,Cloud Scheduler 的权限被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

在 GCP 存储桶中创建对象时触发通过 Cloud Run 部署的数据流作业

Cloud Scheduler 调用 Cloud Run 服务的身份验证

Google Cloud Tasks 无法向 Cloud Run 进行身份验证

尝试部署到 Google Cloud Run 时出现权限错误

在 iOS 上 Parse.Cloud.run 很慢

Google Cloud Run 一遍又一遍地错误运行