GCP Cloud Scheduler 为 HTTP 目标类型抛出错误

Posted

技术标签:

【中文标题】GCP Cloud Scheduler 为 HTTP 目标类型抛出错误【英文标题】:GCP Cloud Scheduler throws ERROR for a HTTP targettype 【发布时间】:2020-03-20 08:05:25 【问题描述】:

我创建了一个 GCP Cloud Scheduler 作业,每 15 分钟运行一次。它应该从我的 Node js 应用程序调用 API。 在控制台中,作业定义如下所示:

Description: A job
Frequency: */15 * * * *
Timezone: Central Standard Time
Target: HTTP
URL: https://<company url>/api/email-reminder/
HTTP method: GET
Auth header: Add OIDC token
Service account: xxxxxxxxxxx-compute@developr.gserviceaccount.com

当它运行时,它会在日志中返回以下内容:


httpRequest: 
 
 insertId: "15wxxxxxxge1lv"  

jsonPayload: 
  @type: "type.googleapis.com/google.cloud.scheduler.logging.AttemptFinished"   
  jobName: "projects/<project name>/locations/us-central1/jobs/xxxxxxxxx-scheduler-emailreminders-1"   
  status: "UNKNOWN"   
  targetType: "HTTP"   
  url: "https://<company url>/api/email-reminder/"   
 
 logName: "projects/<project name>/logs/cloudscheduler.googleapis.com%2Fexecutions"  
 receiveTimestamp: "2019-11-14T04:45:50.280446452Z"  

resource: 

labels: …   
  type: "cloud_scheduler_job"   
 
 severity: "ERROR"  
 timestamp: "2019-11-14T04:45:50.280446452Z"  

如何找到有关错误的更多信息?

【问题讨论】:

StackDriver 日志说什么?它可能会给你一些提示 我帖子的后半部分是作业运行的 StackDriver 日志条目。 用 curl 手动调用端点会发生什么?在 CLI gcloud 中配置服务帐户。然后获取身份令牌gcloud auth print-identity-token。然后执行curl -H 'Authorization: Bearer ID_TOKEN' https://&lt;company url&gt;/api/email-reminder/ 我假设服务帐户中的错误是您问题中的拼写错误,而不是 Cloud Scheduler 任务定义中的错误:@developr 你能提供使用的服务帐户的角色列表吗? 【参考方案1】:

我最近在针对 HTTPS 目标使用 Cloud Scheduler 时看到了类似的问题。每隔一段时间,调度程序就会失败,我得到的只是一条像你这样的日志消息。

在日志查看器中查看,日志的关键部分在日志头中:

"status":"RESOURCE_EXHAUSTED",
"@type":"type.googleapis.com/google.cloud.scheduler.logging.AttemptFinished"

并在日志数据中:

httpRequest: 
  status: 429   

jsonPayload: 
  @type: "type.googleapis.com/google.cloud.scheduler.logging.AttemptFinished"   
  jobName: "projects/joburlhere"   
  status: "RESOURCE_EXHAUSTED"   
  targetType: "HTTP"   
  url: "https://urlgoeshere"   

severity: "ERROR" 

“资源耗尽”是429错误码的描述。

这里有这段代码的描述:

https://cloud.google.com/apis/design/errors

429 RESOURCE_EXHAUSTED 超出资源配额或达到速率限制。客户端应查找 google.rpc.QuotaFailure 错误详细信息以获取更多信息。

鉴于我每小时运行一次此作业,并且接收器是一个非常普通的云函数,我不会做任何导致资源耗尽的事情。所以我认为这是谷歌云基础设施反复出现的暂时性问题。我猜测云功能对于该特定请求不可用,并且因为我使用默认设置设置了云功能,所以调度程序没有重试。

此外,可以配置调度程序作业以在失败时重试。此功能未显示在 Web 控制台中,但您可以使用 gcloud 命令对其进行控制。

默认设置是不重试。

查看--max-retry-attempts 标志。

https://cloud.google.com/sdk/gcloud/reference/scheduler/jobs/update/http

pubsub Jobs 也有类似的控件

https://cloud.google.com/sdk/gcloud/reference/scheduler/jobs/update/pubsub

【讨论】:

【参考方案2】:

这是因为您指定的 http 端点未在默认尝试期限内返回响应。 Refer the link

【讨论】:

我建议您首先检查您指定的 HTTP 端点的日志。如果它对调度程序发出的请求有 200 响应状态码,答案是你去。如果它有其他错误,您仍然会得到 UNKNOWN 响应状态。指定的答案强烈建议尝试。使用这个解决了我的错误。【参考方案3】:

超时调度作业进程的默认值为180s,您可以通过gcloud命令更改

gcloud scheduler jobs update http my-super-job --attempt-deadline 540s

您还可以使用此命令查看作业的完整信息...

gcloud scheduler jobs list
gcloud scheduler jobs describe my-super-job

【讨论】:

谢谢,这真的为我解决了(同样的)问题

以上是关于GCP Cloud Scheduler 为 HTTP 目标类型抛出错误的主要内容,如果未能解决你的问题,请参考以下文章