如何在受 IAP 保护时使用 App Engine HTTP 运行 Cloud Scheduler 作业

How to run a Cloud Scheduler job with App Engine HTTP when protected by IAP

我在 Google App Engine Standard 上有一个 Python 应用程序,它使用 Google Cloud Identity Aware Proxy (IAP) 进行保护。

我想通过使用 Cloud Scheduler 每天触发我的应用程序的一部分。 (它正在调用 API,进行计算,并将结果存储在 Google 云存储中。)

为此,我尝试在“App Engine HTTP”上触发 POST 请求。示例 URL:“/refresh_data”

当运行作业时,出现以下错误:

jsonPayload: {
status: "FAILED_PRECONDITION"
relativeUrl: "/refresh_data"
jobName: "..."
@type: "type.googleapis.com/google.cloud.scheduler.logging.AttemptFinished"
targetType: "APP_ENGINE_HTTP"
}

我找不到与“FAILED_PRECONDITION”错误相关的任何文档,所以我感觉有点卡在这里。

作为替代方案,我尝试触发对简单“HTTP”的 POST 请求,并通过将 IAP 中的所有者访问级别授予我用于 Cloud Scheduler 的服务帐户。这次,我收到的错误消息如下:

 jsonPayload: {
 status: "UNAUTHENTICATED"
 @type: "type.googleapis.com/google.cloud.scheduler.logging.AttemptFinished"
 jobName: "..."
 targetType: "HTTP"
 url: "https:.../refresh_data"
 }

我真的不明白如何进行这项工作...Cloud Scheduler documentation 几乎没有记录“App Engine HTTP”选项,也没有任何关于 IAP 使用的记录...

任何帮助将不胜感激:)

您可以从 IAP 查看此相关 documentation,了解如何使用服务帐户进行身份验证。

每当您使用 Cloud Scheduler 时,请求都将通过其服务帐户完成,因此要遵循的指南应该是上面链接的指南,因为您基本上是在尝试以编程方式进行身份验证,而不是使用 Google sign-in.

也就是说,您需要在向 IAP-secured 端点发出请求之前生成 OIDC 令牌。获得 OIDC 令牌后,需要将其包含在 Authorization: Bearer header.

这是 IAP 的阴暗面。我在几个月前将此反馈发送至 Google。与 Pubsub 相同,即使您使用具有正确授权的服务帐户,您也无法触发并保护 App Engine IAP 免受这些无服务器产品的影响。

我在将我的 GAE 应用程序从 python 2.7 升级到 python3(标准)时遇到了类似的问题。 当 运行 将我之前的 cron.yaml 作业设置为云调度程序作业时,我收到了与您相同的错误消息(状态:“FAILED_PRECONDITION”)。 之前 cron.yaml 文件的上传对 运行 也不起作用。 然后我发现只需在 url 上添加结尾的 '/' 即可修复它。 所以像这样的 cron:

cron:
- description: competition participants pilot list update
  url: /daily1/
  schedule: every 8 hours from 05:00 to 21:00

使用云SDK上传后有效:

gcloud app deploy cron.yaml --project my-gae-project

(我忘记了)我还必须:

gcloud services enable cloudscheduler.googleapis.com --project my-gae-project