You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cloud Scheduler调用Cloud Run服务权限被拒,求排查方向

问题

我正尝试使用Cloud Scheduler设置周期性任务,调用Cloud Run服务的/task端点。调度器任务与Cloud Run服务使用同一服务账号,该账号已被授予以下IAM权限:

Cloud Run Admin
Cloud Run Invoker
Cloud Scheduler Job Runner
Cloud SQL Client
Secret Manager Secret Accessor
Service Account User

日志信息如下:

{
  "insertId": "",
  "jsonPayload": {
    "status": "PERMISSION_DENIED",
    "url": "https://{CLOUD_RUN_URL}-uc.a.run.app/api/v1/tasks/MyTask",
    "targetType": "HTTP",
    "@type": "type.googleapis.com/google.cloud.scheduler.logging.AttemptFinished",
    "jobName": "projects/{PROJECTID}/locations/us-central1/jobs/MyTask"
  },
  "httpRequest": {
    "status": 403
  },
  "resource": {
    "type": "cloud_scheduler_job",
    "labels": {
      "job_id": "MyTask",
      "project_id": "PROJECT",
      "location": "us-central1"
    }
  },
  "timestamp": "2023-10-23T01:15:43.236434245Z",
  "severity": "ERROR",
  "logName": "projects/{PROJECTID}/logs/cloudscheduler.googleapis.com%2Fexecutions",
  "receiveTimestamp": "2023-10-23T01:15:43.236434245Z"
}

我已按照官方认证文档配置调度器任务使用同一服务账号的OIDC Token,并将受众URL设置为任务URL。

Cloud Run服务配置为Allow unauthenticated(允许未认证访问),Ingress设置为All(全部来源)。从日志中可看到请求头信息:

{'Host': '{CLOUDRUN_URL}-uc.a.run.app', 'Content-Type': 'application/octet-stream', 'X-Cloudscheduler': 'true', 'X-Cloudscheduler-Jobname': 'MyTask', 'Authorization': '*****', 'Content-Length': '2', 'User-Agent': 'Google-Cloud-Scheduler', 'X-Cloud-Trace-Context': '****', 'Traceparent': '***', 'X-Forwarded-For': '***', 'X-Forwarded-Proto': 'https', 'Forwarded': 'for="***";proto=https', 'Accept-Encoding': 'gzip, deflate, br'}

但请求仍返回403状态码。看起来调度器已触发请求,但Authorization头中的OIDC Token未通过认证,请问还有哪些排查方向?

排查方向

  • 验证OIDC Token受众的精确匹配:确认调度器设置的受众URL与Cloud Run服务的请求URL完全一致,包括协议、域名、路径,不能多末尾斜杠或其他变体。比如请求URL是https://xxx.run.app/api/v1/tasks/MyTask,受众必须严格对应这个地址。
  • 检查Cloud Run服务的自定义认证逻辑:即使服务开启了Allow unauthenticated,如果代码内部有强制校验Authorization头的逻辑,会覆盖IAM设置。需要确认服务代码是否对OIDC Token的iss(签发者)、sub(主体)等字段做了额外校验。
  • 手动解码验证OIDC Token内容:提取调度器发送的Token,通过Google Token Info端点解码后检查关键字段:
    • aud:是否与服务URL完全匹配;
    • iss:是否为https://accounts.google.com;
    • exp:Token是否未过期;
    • email:是否为服务账号邮箱且状态为verified;
    • azp:是否为调度器使用的服务账号客户端ID。
  • 确认服务账号权限的绑定范围:确保Cloud Run Invoker权限是直接绑定到Cloud Run服务实例,而非仅项目级别。项目级权限可能因服务的IAM规则覆盖不生效,需在Cloud Run服务的IAM页面明确添加该服务账号为Cloud Run Invoker角色。
  • 排查请求路径的有效性:确认Cloud Run服务确实部署了/api/v1/tasks/MyTask端点,部分框架会对未匹配路径返回403而非404,需排除路由配置错误。
  • 验证服务版本与配置一致性:确认当前运行的Cloud Run服务是最新版本,无旧认证逻辑残留,可尝试重新部署服务确保配置生效。
  • 检查调度器认证方式选择:确认调度器任务选择的是OIDC Token而非OAuth Token,两者受众配置逻辑不同,选错类型会导致认证失败。

内容的提问来源于stack exchange,提问作者Khalil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 17:30:36