从 Python 中调用 Google Cloud Function

use*_*360 14 python python-requests google-cloud-platform google-cloud-functions

我正在尝试使用以下命令从 Python 中调用 Google Cloud 函数:

import requests
url = "MY_CLOUD_FUNCTON_URL"
data = {'name': 'example'}
response = requests.post(url, data = data)
Run Code Online (Sandbox Code Playgroud)

但我得到了错误: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"}' 
Run Code Online (Sandbox Code Playgroud)

任何帮助将非常感激!

Mar*_*ani 11

给定一个在HTTP模式下工作的云函数,需要身份验证才能触发。

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

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(
    audience, 
    headers={'Authorization': f"Bearer {TOKEN}", "Content-Type": "application/json"},
    data=json.dumps({"key": "value"})  # possible request parameters
)
r.status_code, r.reason
Run Code Online (Sandbox Code Playgroud)


JKl*_*nne 4

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

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

  1. 创建一个服务帐户并为其授予 Cloud Functions Invoker 角色(如果您只想限制其权限仅调用 GCF )
  2. 为服务帐户分配角色后,下一页将为您提供创建密钥的选项
  3. 创建服务帐户密钥并将其下载为 后credentials.json,下一步就很简单了。您只需使用文件的路径填充环境变量 即可。GOOGLE_APPLICATION_CREDENTIALScredentials.json

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