【问题标题】:Deploy multiple functions to Google Cloud Functions in the terminal?将多个函数部署到终端中的 Google Cloud Functions?
【发布时间】:2019-06-11 18:34:10
【问题描述】:

要为单个触发事件部署单个函数,我们可以按照有关部署Google Cloud Functions 的文档中概述的说明进行操作:

gcloud functions deploy NAME --runtime RUNTIME TRIGGER [FLAGS...]

部署平均需要30s-2m,还算合理。

但是,我想知道是否可以编写一个脚本(例如在 python 中)来一次部署多个函数?

例如:

//somefile.py

gcloud functions deploy function_1 --runtime RUNTIME TRIGGER [FLAGS...]
gcloud functions deploy function_2 --runtime RUNTIME TRIGGER [FLAGS...]

【问题讨论】:

  • 为什么要用 Python 而不是 Bash 或 PowerShell?
  • 更新了我的问题以更好地解释自己。想法更多是运行 python 脚本,例如deploy.py 然后自动执行这些命令,这样我就可以运行脚本去吃午饭了。
  • 当然,我只是想问一下——如果你已经有一些 bash/ps 来为你做这件事,你就不能写一个 bash/ps 脚本来为你做部署吗?

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


【解决方案1】:

我真的很喜欢使用invoke 库来解决此类问题。特别是,它非常适合在 Python 脚本中运行 bash 命令(例如 gcloud),而无需在 subprocess 中进行处理。

在您的情况下,您可以制作一个看起来像这样的tasks.py 文件

from invoke import task

@task
def deploy_cloud_functions(c):
    c.run('gcloud functions deploy function_1 --runtime RUNTIME TRIGGER [FLAGS...]')
    c.run('gcloud functions deploy function_2 --runtime RUNTIME TRIGGER [FLAGS...]')

然后通过调用来运行它

invoke deploy-cloud-functions

请注意,如果您将函数命名为 deploy_cloud_functions,则必须使用:invoke deploy-cloud-functions(注意 -)来调用它。您可以使用invoke --list在您的目录中找到当前可用任务的列表

您还可以使用线程库将其并行化(尽管我没有在自己的调用中使用它进行测试)。不过,它肯定会在控制台中产生丑陋的输出。即

from threading import Thread
from invoke import task

@task
def deploy_cloud_functions(c):
    Thread(lambda x:
           c.run('gcloud functions deploy function_1 --runtime RUNTIME TRIGGER [FLAGS...]')
    ).start()
    Thread(lambda x:
           c.run('gcloud functions deploy function_2 --runtime RUNTIME TRIGGER [FLAGS...]')
    ).start()

【讨论】:

  • 文件放在哪里?我收到错误消息“不知道 'deploy_cloud_functions' 是什么!”
  • 你应该打开你的shell并在tasks.py文件所在的同一目录中调用invokeinvoke docs 有一个非常有用的教程。
  • 我就是这么做的,并且我在当前目录中有 tasks.py。但是我仍然收到消息不知道'deploy_cloud_functions'是什么!发生了什么事...在您编写的终端中调用 deploy_cloud_functions 对吗?它是如何知道查找 tasks.py 的?
  • 哦哇..想通了。您可以查看可用函数列表:invoke --list。从那里我发现如果你用 _ 编写函数,你必须使用 -
【解决方案2】:

如果您不想只使用 python 脚本来调用 gcloud 命令,因为它与执行 bash 脚本相同,您可以使用Cloud Functions API Client Library for Python

这个库的作用是创建和执行对Cloud Functions API 的HTTP 调用。您可以查看Cloud Functions REST reference 以了解这些调用的结构以及如何构建它们。

例如,我做了一个快速示例来测试这个 API 库,列出我项目中运行的函数:

import httplib2
import pprint

from googleapiclient.discovery import build
from oauth2client.service_account import ServiceAccountCredentials


credentials = ServiceAccountCredentials.from_json_keyfile_name(
                "key.json",
                scopes="https://www.googleapis.com/auth/cloud-platform")

http = httplib2.Http()
http = credentials.authorize(http)

service = build("cloudfunctions", "v1", http=http)

operation = service.projects().locations().functions().list(parent='projects/wave16-joan/locations/europe-west1')

pprint.pprint(operation)

您必须安装模块oauth2clientgoogle-api-python-clienthttplib2。如您所见,您需要创建一个服务帐户才能执行 REST API 调用,这需要“https://www.googleapis.com/auth/cloud-platform”范围来创建 CF。我自己创建了一个具有project/editor 权限的服务帐户,我认为这是创建 CF 所需的角色。

最后,要执行这个脚本,你可以做python <script_name>.py

现在,由于您要创建多个函数(请参阅此 API 调用需要如何构造here),要调用的服务应该如下所示:

operation = service.projects().locations().functions().create(
        location='projects/wave16-joan/locations/europe-west1',
        body={
                "name":"...",
                "entryPoint":"..."
                "httpsTrigger": {
                        "url":"..."
                    }
            }
    )

您必须使用parameters listed here 中的一些填充请求的body。例如,"name" 键应为:

"name":"projects/YOUR_PROJECT/locations/YOUR_PROJECT_LOCATION/functions/FUNCTION_NAME"

附带说明一下,前面文档中列出的大多数主体参数都是可选的,但您需要名称、入口点、源、触发器等。

当然,这比创建 bash 脚本需要更多的工作,但结果更便携、更可靠,并且它允许您创建多个操作以以相同的方式部署多个功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-03
    • 2017-05-03
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    • 2018-05-18
    • 2021-03-09
    • 1970-01-01
    相关资源
    最近更新 更多