尽管问题标签和其他答案与javascript有关,但我想分享python示例,因为它反映了问题中提到的标题和身份验证方面。
Google Cloud Function 提供REST API 接口,其中包含可以在另一个 Cloud Function 中使用的调用方法。尽管文档中提到了使用 Google 提供的客户端库,但 Python 上的 Cloud Function 仍然没有。
相反,您需要使用通用的 Google API 客户端库。[这是蟒蛇之一]。3
使用这种方法的主要困难可能是对身份验证过程的理解。通常,您需要提供两件事来构建客户端服务:
凭据和范围。
获取凭据的最简单方法是在应用程序默认凭据 (ADC) 库上进行中继。关于此的正确文档是:
- https://cloud.google.com/docs/authentication/production
- https://github.com/googleapis/google-api-python-client/blob/master/docs/auth.md
获取范围的地方是每个 REST API 函数文档页面。比如,OAuth 范围:https://www.googleapis.com/auth/cloud-platform
调用“hello-world”云函数的完整代码示例如下。运行前:
- 在您的项目中在 GCP 上创建默认 Cloud Function。
- 注意project_id、函数名称、部署函数的位置。
- 如果您将在 Cloud Function 环境(例如本地)之外调用函数,请根据上述文档设置环境变量 GOOGLE_APPLICATION_CREDENTIALS
- 如果您实际上是从另一个 Cloud Function 调用,则根本不需要配置凭据。
from googleapiclient.discovery import build
from googleapiclient.discovery_cache.base import Cache
import google.auth
import pprint as pp
def get_cloud_function_api_service():
class MemoryCache(Cache):
_CACHE = {}
def get(self, url):
return MemoryCache._CACHE.get(url)
def set(self, url, content):
MemoryCache._CACHE[url] = content
scopes = ['https://www.googleapis.com/auth/cloud-platform']
# If the environment variable GOOGLE_APPLICATION_CREDENTIALS is set,
# ADC uses the service account file that the variable points to.
#
# If the environment variable GOOGLE_APPLICATION_CREDENTIALS isn't set,
# ADC uses the default service account that Compute Engine, Google Kubernetes Engine, App Engine, Cloud Run,
# and Cloud Functions provide
#
# see more on https://cloud.google.com/docs/authentication/production
credentials, project_id = google.auth.default(scopes)
service = build('cloudfunctions', 'v1', credentials=credentials, cache=MemoryCache())
return service
google_api_service = get_cloud_function_api_service()
name = 'projects/{project_id}/locations/us-central1/functions/function-1'
body = {
'data': '{ "message": "It is awesome, you are develop on Stack Overflow language!"}' # json passed as a string
}
result_call = google_api_service.projects().locations().functions().call(name=name, body=body).execute()
pp.pprint(result_call)
# expected out out is:
# {'executionId': '3h4c8cb1kwe2', 'result': 'It is awesome, you are develop on Stack Overflow language!'}