从Python中调用Google Cloud函数



我正试图使用以下命令从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"}' 

任何帮助都将不胜感激!

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(
'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

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

然而,如果你想限制谁可以调用你的GCF,你必须再执行几个步骤。

  1. 创建一个服务帐户并赋予其云函数调用程序角色(如果您只是想限制其仅调用GCF的权限(
  2. 为服务帐户分配角色后,下一页将提供创建密钥的选项
  3. 在创建服务帐户密钥并将其下载为credentials.json之后,下一步很简单。您只需使用credentials.json文件的路径填充环境变量GOOGLE_APPLICATION_CREDENTIALS

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

这对许多人来说可能是显而易见的,但要补充Marco的回答(我还不能评论(:

请确保安装google-auth软件包,而不是google软件包。有关GitHub上代码的更多详细信息,请参阅文档和requirements.txt。

相关内容

  • 没有找到相关文章

最新更新