Развернуть несколько функций в Google Cloud Functions в терминале? - PullRequest
0 голосов
/ 17 января 2019

Чтобы развернуть одну функцию для одного события триггера, мы можем следовать инструкциям, приведенным в документации по развертыванию Облачных функций Google :

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

Для развертывания требуется в среднем 30–2 м, что нормально и разумно.

Однако мне было интересно, можно ли написать скрипт (например, на python) для развертывания нескольких функций одновременно?

например. :

//somefile.py

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

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Если вы не хотите просто использовать скрипт python для вызовов команды gcloud, поскольку это то же самое, что и скрипт bash, вы можете использовать клиентскую библиотеку Cloud Functions API для Python .

Что делает эта библиотека, так это создает и выполняет HTTP-вызовы к Cloud Functions API . Вы можете проверить Ссылка REST Cloud Functions , чтобы увидеть, как эти вызовы структурированы и как их создавать.

Например, я сделал быстрый пример для тестирования этой библиотеки 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)

Вам нужно будет установить модули oauth2client, google-api-python-client и httplib2. Как видите, вам нужно будет создать учетную запись службы для выполнения вызовов API REST, для которой требуется "https://www.googleapis.com/auth/cloud-platform" область действия для создания CF. Я сам создал учетную запись службы с разрешениями project/editor, которая Я считаю, что это необходимые роли для создания CF.

Наконец, чтобы выполнить этот скрипт, вы можете просто сделать python <script_name>.py

Теперь, так как вы хотите создать несколько функций (посмотрите, как должен быть структурирован этот вызов API здесь ), вместо этого должна вызываться следующая служба:

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

Вам нужно будет заполнить body запроса некоторыми из параметров, перечисленных здесь . Например, ключ "name" должен выглядеть следующим образом:

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

В качестве примечания, большинство параметров тела, перечисленных в предыдущей документации, являются необязательными, но вам потребуется имя, entryPoint, источник, триггер и т. Д.

Конечно, это требует больше работы, чем создание bash-скрипта, но результат является более переносимым и надежным, и это позволит вам создавать несколько операций для одновременного развертывания нескольких функций.

0 голосов
/ 17 января 2019

Мне действительно нравится использовать библиотеку invoke для подобных задач. В частности, он хорошо подходит для запуска команд bash (например, gcloud) в скрипте Python без разбора в 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

Вы также можете распараллелить его, используя библиотеку потоков (хотя я не проверял, использую ли он внутри себя, вызывайте). Это, безусловно, сделает для уродливого вывода в консоли, хотя. * 1021 Т.е. *

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...