尝试运行 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 进行身份验证