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
相关产品推荐
相关产品推荐

