【问题标题】:How can I trigger an HTTP Cloud Function from within Google App Engine?如何从 Google App Engine 中触发 HTTP 云函数?
【发布时间】:2024-04-19 10:05:01
【问题描述】:

我在 Google App Engine 标准环境 Python 中有一个 Flask 应用程序,我还有一个带有 HTTP 触发器的云函数,它接受包含文件 URL 的 JSON 正文。 CF 在该 URL 下载文件,然后将其保存到 GCS 存储桶。 GAE 服务帐户具有 Cloud Function Invoker 权限,但在我的 GAE 代码中使用 urlfetch.fetch() 触发 CF 时,App Engine 代码会收到 403 Forbidden 错误,除非我让任何人都可以调用 CF 触发器。

如何在 Python 中从 GAE 成功调用/触发 CF?我认为答案是其中之一:

  1. 将 GAE 服务帐户的 IAM 权限设置为 {enlighten me here}
  2. 像这样在urlfetch.fetch() 中添加身份验证标头{不同的启示}
  3. 使 CF 可从任何地方触发,但硬编码一些密钥,以便 CF 代码本身处理身份验证。

【问题讨论】:

  • 调用受 IAP 授权保护的 Cloud Functions 时,需要添加 HTTP Authorization: Bearer [IDENTITY_TOKEN] 标头。

标签: python google-app-engine google-cloud-platform google-cloud-functions google-cloud-iam


【解决方案1】:

这里有很好的记录:Cloud Functions Authentication 简而言之,您必须在身份验证标头中提供您的服务帐户凭据。

要获取您的凭据,请使用Google Auth Client library。如果您在本地进行测试,您应该创建一个服务帐户 JSON 并将其加载到环境变量 GOOGLE_APPLICATION_CREDENTIALS,但在 App Engine 上它将从头开始工作。

获得令牌后,将其作为身份验证标头传递,如下所示:

    auth_req = google.auth.transport.requests.Request()
    auth_token = google.oauth2.id_token.fetch_id_token(auth_req, cloud_function_url)

    response = requests.post(cloud_function_url, json=payload, headers={"Authorization" : f"Bearer {auth_token}"})

【讨论】: