【问题标题】:How to run a Cloud Scheduler job with App Engine HTTP when protected by IAP如何在受 IAP 保护时使用 App Engine HTTP 运行 Cloud Scheduler 作业
【发布时间】:2020-12-22 15:21:24
【问题描述】:

我有一个基于 Google App Engine Standard 的 Python 应用程序,该应用程序使用 Google Cloud Identity Aware Proxy (IAP) 进行保护。

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

为此,我尝试在“App Engine HTTP”上触发 POST 请求。示例网址:“/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 中的 Owner 访问级别授予我用于 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 使用的记录...

任何帮助将不胜感激:)

【问题讨论】:

    标签: google-app-engine google-cloud-storage google-app-engine-python google-cloud-scheduler identity-aware-proxy


    【解决方案1】:

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

    【讨论】:

    • 好的...非常感谢,这非常有用!您认为我可以使用其他替代方法来代替云调度程序吗?
    • Cloud scheduler 是解决此问题的正确工具,但不能直接调用 App Engine。改为调用函数或 Cloud Run。从那里,您可以通过 IAP 调用 App Engine 端点。但是,您的 refresh_data 过程需要多长时间?
    • 完美,因为您使用 Cloud Functions 有 9 分钟的超时时间。注意,默认函数超时时间为 60s,部署函数时更改此默认值!
    • 我将我的代码移到了由 pub/sub 触发的云函数中,并将其与 Cloud Scheduler 同步。我不得不改变一些东西才能让它工作,但现在它完美地工作了!谢谢!
    • 从 Cloud Scheduler 触发 IAP 背后的 AppEngine 服务没有问题。您只需为其使用特殊的触发器类型 - AppEngine HTTP,它应该可以工作。我在我的 GCP 项目中尝试过它并且它有效。我明白了,tim@,不过,您遇到了一些奇怪的问题“FAILED_PRECONDITION”,我认为这可能是由服务器和触发器之间的标头要求不匹配引起的,而不是由 IAP 引起的(顺便说一句,您是否尝试禁用 IAP 以验证它是否有效?)。您能否提供更多详细信息,您尝试调用哪个端点? @蒂姆
    【解决方案2】:

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

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

    话虽如此,您需要在向受 IAP 保护的端点发出请求之前生成 OIDC 令牌。获得 OIDC 令牌后,需要将其包含在 Authorization: Bearer 标头中。

    【讨论】:

    • 谢谢!我看到了这个文档,但由于它的实现似乎相当复杂(与 IAP 的极其简单相反),我认为 App Engine 会为我处理这类事情。我会尝试实现这一点。您是否尝试过并成功了?
    【解决方案3】:

    在将我的 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
    

    【讨论】:

    • 哇,好的。我没有对此进行测试,因为@guillaume blaquiere 的回答解决了我的问题,但是您的应用是否也受 IAP 保护?
    • 不,抱歉。我只是有同样的错误信息。而且我在上面进行了编辑,我还必须启用调度程序服务......
    猜你喜欢
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 2022-10-23
    • 2011-02-28
    • 2021-10-15
    • 1970-01-01
    • 2018-07-22
    • 2013-10-20
    相关资源
    最近更新 更多