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 手动调用端点会发生什么?在 CLIgcloud
中配置服务帐户。然后获取身份令牌gcloud auth print-identity-token
。然后执行curl -H 'Authorization: Bearer ID_TOKEN' https://<company url>/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 DataFlow 读取 BigTable 并转换为通用记录