"Триггер-ведро" Google Cloud Functions не работает должным образом - PullRequest
0 голосов
/ 26 мая 2020

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

Я развернул ее с помощью следующей команды: * Я ожидаю, что функция будет срабатывать всякий раз, когда я загружаю, удаляю, архивирую и обновляю метаданные любого объекта в моем сегменте, но она срабатывает только при загрузке файла.

Что я мог упустить? В документации ничего не упоминается об этом c, в ней утверждается, что вышеупомянутые операции будут работать.

Ответы [ 2 ]

1 голос
/ 26 мая 2020

Ознакомьтесь с документацией:

Использование флагов --trigger-resource MY_RESOURCE и --trigger-event MY_EVENT - это наиболее явный способ указать триггер для фоновой функции. Однако gcloud предоставляет сокращения для Pub / Sub и Cloud Storage:

Это Shorthands . Таким образом, это неявно выполняет за вас выбор. Чтобы узнать больше о том, что делает команда, я рекомендую вам использовать опцию --log-http для просмотра http-вызова, выполняющего gcloud. Для этой команды много, и на данный момент я получил это

==== request start ====
uri: https://cloudfunctions.googleapis.com/v1/projects/<MyProject>/locations/us-central1/functions?alt=json
method: POST
== headers start ==
b'Authorization': --- Token Redacted ---
b'accept': b'application/json'
b'accept-encoding': b'gzip, deflate'
b'content-length': b'903'
b'content-type': b'application/json'
b'user-agent': b'google-cloud-sdk gcloud/293.0.0 command/gcloud.functions.deploy invocation-id/480b4938d2e1469bab2e1a236c5ac53a environment/devshell environment-version/None interactive/True from-script/False python/3.7.3 term/screen (Linux 4.1
9.112+)'
== headers end ==
== body start ==
{"eventTrigger": {"eventType": "google.storage.object.finalize", "resource": "projects/_/buckets/<myBucket>"}, ....

Вы видите "eventType": "google.storage.object.finalize", поэтому поведение, которое вы видите, является правильным. Только когда файл завершен и событие запускается для вашей функции. Этот выбор был сделан за вас.

Теперь, как решить ваш вариант использования. 2 способа

  • Развертывание 4 облачных функций, по одной для каждого типа события (финализация, удаление, обновление метаданных и архивирование) (не моя любимая рекомендация, см. Ниже)
  • Создать одну тему PubSub c. Создайте 4 уведомления pubsub в облачном хранилище , по одному для каждого типа события. А затем подключите свою функцию к pubsub topi c --trigger-topic=... вместо --trigger-bucket=...
0 голосов
/ 30 мая 2020

Я попробовал включить уведомления Pub / Sub, я изменил ваш код, но мне не хватает раздела атрибутов, который должен содержать contentType.

def bucket_logger_function(event, context):
    import base64
    import json

    # Print Event Type and Event ID
    print('Event ID: ' + context.event_id)
    print('Event Type: ' + context.event_type)

    # Print Attributes  <-- This is the part that fails
    attributes = base64.b64decode(event['attributes']).decode('utf-8')
    print(attributes['eventType'])

    # Print Payload
    payload = json.loads(base64.b64decode(event['data']).decode('utf-8'))
    print(payload['name'])
    print(payload['bucket'])

Я думаю, что если вы получите завис синтаксического анализа атрибутов, которые вам нужно go, чтобы применить некоторые logi c к типу события.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...