Cloud Scheduler调用HTTP目标时出现INTERNAL错误求助
尝试使用Cloud Scheduler每周调度一个HTTP目标类型的Cloud Function,手动触发运行时出现以下错误:
{ "httpRequest": {"status": 500}, "insertId": "op2w2lfi2zmuu", "jsonPayload": { "@type": "type.googleapis.com/google.cloud.scheduler.logging.AttemptFinished", "jobName": "projects/my-project-id/locations/us-central1/jobs/my-job-name", "status": "INTERNAL", "targetType": "HTTP", "url": "https://my-http-trigger.a.run.app/" }, "logName": "projects/my-project-id/logs/cloudscheduler.googleapis.com%2Fexecutions", "receiveTimestamp": "2023-05-16T12:37:06.594694219Z", "resource": {"labels": {3}, "type": "cloud_scheduler_job"}, "severity": "ERROR", "timestamp": "2023-05-16T12:37:06.594694219Z" }
调度作业配置细节:
- 运行作业的服务账号已配置Cloud Run Invoker角色
- 认证头采用OIDC token
- 受众设置为:
https://my-http-trigger.a.run.app/ - Cloud Function入站权限设置为「允许所有连接」
Cloud Function单独运行无报错,但Cloud Scheduler执行后始终显示status of last execution = failed,需要排查问题原因。
修正受众URL格式
部分场景下Cloud Function的HTTP触发器对URL结尾的斜杠敏感,尝试将受众设置改为https://my-http-trigger.a.run.app(移除末尾的/),重新触发调度测试。手动验证OIDC token调用有效性
用服务账号生成OIDC token后直接调用Function,确认token是否有效:
- 执行命令生成token:
gcloud auth print-identity-token --audiences=https://my-http-trigger.a.run.app --impersonate-service-account=你的服务账号邮箱 - 用curl调用Function:
curl -H "Authorization: Bearer 生成的token" https://my-http-trigger.a.run.app
如果调用失败,根据返回的错误信息判断是token权限不足、受众不匹配还是其他问题。
检查Cloud Function的触发日志
即便Function单独运行正常,Cloud Scheduler的请求可能携带特殊头信息或参数导致内部报错。去Cloud Function的日志页面,按时间戳筛选调度触发的请求,查看是否有500错误的详细堆栈,定位具体报错点。确认区域一致性
检查Cloud Scheduler的部署区域(us-central1)和Cloud Function的部署区域是否一致,跨区域调度可能存在网络或权限兼容问题,将调度作业调整到Function所在区域再测试。核对服务账号权限绑定
确认服务账号的Cloud Run Invoker角色是绑定在Cloud Function所在项目或Function资源本身上,而非其他无关资源。可以通过IAM页面查看服务账号的权限明细,确保权限范围正确。
内容的提问来源于stack exchange,提问作者Jonas Ouazan

