在终端中将多个功能部署到Google Cloud Functions?

时间:2019-01-17 14:22:44

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

要为单个触发事件部署单个功能,我们可以按照文档中有关部署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...]

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:1)

如果您不想只使用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

现在,由于您要创建多个函数(请参见here,请参见此API调用的结构),因此,应使用以下服务:

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"

请注意,先前文档中列出的大多数主体参数都是可选的,但您需要输入名称,entryPoint,源代码,触发器等。

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