【问题标题】:Calling a Google Cloud Function from within Python从 Python 中调用 Google Cloud 函数
【发布时间】:2020-08-17 18:00:28
【问题描述】:

我正在尝试使用以下方法在 Python 中调用 Google Cloud 函数

import requests
url = "MY_CLOUD_FUNCTON_URL"
data = {'name': 'example'}
response = requests.post(url, data = data)

但我得到了错误:Your client does not have permission to get URL MY_CLOUD_FUNCTON from this server

有谁知道如何避免这个错误?我假设我应该以某种方式将凭据作为请求的一部分传递?

另外请注意,如果我尝试通过 gcloud 从下面的命令行调用该函数,那么它可以工作,但我想从 python 中执行此操作

gcloud functions call MY_CLOUD_FUNCTON --data '{"name": "example"}' 

任何帮助将不胜感激!

【问题讨论】:

    标签: python google-cloud-platform python-requests google-cloud-functions


    【解决方案1】:

    这里有几个选项。要么向公众开放该功能,以便任何人都可以调用它,要么采取更安全的路线,尽管需要更多的步骤。我将介绍第二个选项,因为这是出于安全原因我建议的选项,但是如果您对简单地向公众开放该功能感到满意(毕竟,如果您尝试创建公共端点,这尤其有用),请参阅此documentation.

    如果您想限制谁可以调用您的 GCF,则必须执行更多步骤。

    1. Create a service account 并为其赋予 Cloud Functions Invoker 角色(如果您只是想将其权限限制为仅调用 GCF)
    2. 为服务帐户分配角色后,下一页将为您提供create a key 的选项
    3. 创建服务帐户密钥并将其下载为credentials.json 后,下一步就很简单了。您只需 populate the environment variable GOOGLE_APPLICATION_CREDENTIALScredentials.json 文件的路径即可。

    完成这些步骤后,您可以像以前一样简单地调用 GCF,只是这一次,它将调用它作为您创建的服务帐户,其中包含所有必要的权限调用 GCF。

    【讨论】:

    • 不过,Google 不建议这样做,因为这样您的钥匙就在身边。 “如果服务帐户密钥被泄露,可能会带来安全风险。我们建议您避免下载服务帐户密钥,而是使用 Workload Identity Federation。”
    【解决方案2】:

    给定一个在 HTTP 模式下工作的 Cloud Function,它需要身份验证才能被触发。

    您需要生成一个身份验证令牌并将其插入到header中,如下所示:

    import os
    import json
    import requests
    import google.oauth2.id_token
    import google.auth.transport.requests
    
    os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = './my-service-account.json'
    request = google.auth.transport.requests.Request()
    audience = 'https://mylocation-myprojectname.cloudfunctions.net/MyFunctionName'
    TOKEN = google.oauth2.id_token.fetch_id_token(request, audience)
    
    r = requests.post(
        'https://mylocation-myprojectname.cloudfunctions.net/MyFunctionName', 
        headers={'Authorization': f"Bearer {TOKEN}", "Content-Type": "application/json"},
        data=json.dumps({"key": "value"})  # possible request parameters
    )
    r.status_code, r.reason
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      相关资源
      最近更新 更多