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 目标类型抛出错误的主要内容,如果未能解决你的问题,请参考以下文章

Cloud Scheduler 调用的 GCP Cloud Run 应用的当前最大超时是多少

Google 部署管理器 Cloud Scheduler 类型

GCP Cloud Build 标签发布

使用 GCP Cloud DataFlow 读取 BigTable 并转换为通用记录

我可以为 Terraform for GCP 赋予管理员角色吗? (Cloud Run 域映射示例)

从另一个 GCP 项目访问 Cloud SQL