Реализация облачной функции для публикации в pubsub, запускаемой GCS finalize - PullRequest
0 голосов
/ 06 декабря 2018

Я пытался написать и развернуть облачную функцию в Python.(отказался от node.js из-за грязной документации и относительно быстрого темпа изменений)

Он предназначен для публикации сообщения в теме публикации / публикации, инициируемого по завершении загрузки файла в корзину Google.("финализировать").

Код, который я использую для развертывания функции:

gcloud functions deploy hello_gcs_generic --runtime python37 --trigger-resource bucketcfpubsub

Я пытался с помощью этого сценария, предоставленного Google

import time

from google.cloud import pubsub_v1

project_id = "bucketcfpubsub"
topic_name = "projects/bucketcfpubsub/topics/pubsub"

publisher = pubsub_v1.PublisherClient()
topic_path = publisher.topic_path(project_id, topic_name)

def callback(message_future):
# When timeout is unspecified, the exception method waits indefinitely.
if message_future.exception(timeout=30):
    print('Publishing message on {} threw an Exception {}.'.format(
        topic_name, message_future.exception()))
else:
    print(message_future.result())

for n in range(1, 10):
    data = u'Message number {}'.format(n)
# Data must be a bytestring
    data = data.encode('utf-8')
# When you publish a message, the client returns a Future.
    message_future = publisher.publish(topic_path, data=data)
    message_future.add_done_callback(callback)

print('Published message IDs:')

# We must keep the main thread from exiting to allow it to process
# messages in the background.
while True:
    time.sleep(60)

К которому я получаю эти ошибки в Google Cloud Console

ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Function load error: Code in file main.py can't be loaded.
Detailed stack trace: Traceback (most recent call last):
  File "/env/local/lib/python3.7/site-packages/google/cloud/functions_v1beta2/worker.py", line 256, in check_or_load_user_function
    _function_handler.load_user_function()
  File "/env/local/lib/python3.7/site-packages/google/cloud/functions_v1beta2/worker.py", line 166, in load_user_function
    spec.loader.exec_module(main)
  File "<frozen importlib._bootstrap_external>", line 728, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "<frozen importlib._bootstrap_external>", line 728, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/user_code/main.py", line 3, in <module>
    from google.cloud import pubsub_v1
ImportError: cannot import name 'pubsub_v1' from 'google.cloud' (unknown location)

Следуя инструкциям этих двух сообщений, я скопировал требования.txt из примера кода helloworld, содержащего только

google-cloud-error-reporting==0.30.0

и обновленные другие облачные функции, такие как bigquery, хранилище и ведение журнала.Затем я получил эти ошибки:

ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Function load error: Code in file main.py can't be loaded.
Detailed stack trace: Traceback (most recent call last):
  File "/env/local/lib/python3.7/site-packages/google/cloud/functions_v1beta2/worker.py", line 256, in check_or_load_user_function
    _function_handler.load_user_function()
  File "/env/local/lib/python3.7/site-packages/google/cloud/functions_v1beta2/worker.py", line 166, in load_user_function
    spec.loader.exec_module(main)
  File "<frozen importlib._bootstrap_external>", line 728, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/user_code/main.py", line 3, in <module>
from google.cloud import pubsub_v1`

, и я также нашел [эту тему] ( ImportError: не могу импортировать имя 'pubsub_v1' из 'google.cloud' (неизвестное местоположение) , но яне совсем понимаю, в чем решение, я попытался заменить pubsub_v1 на google-cloud-pubsub == 0.38.0, который не помог. Вместо этого я получаю эту ошибку:

Deploying function (may take a while - up to 2 minutes)...failed.
ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Function load error: Code in file main.py can't be loaded.
Detailed stack trace: Traceback (most recent call last):
  File "/env/local/lib/python3.7/site-packages/google/cloud/functions_v1beta2/worker.py", line 256, in check_or_load_user_function
    _function_handler.load_user_function()
  File "/env/local/lib/python3.7/site-packages/google/cloud/functions_v1beta2/worker.py", line 166, in load_user_function
    spec.loader.exec_module(main)
  File "<frozen importlib._bootstrap_external>", line 724, in exec_module
  File "<frozen importlib._bootstrap_external>", line 860, in get_code
  File "<frozen importlib._bootstrap_external>", line 791, in source_to_code
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/user_code/main.py", line 3

Кроме того, это делаетне кажется ли это устойчивым исправлением, если код перестанет работать после того, как Google обновит pubsub до новой версии?

Так что я очень новичок и совершенно потерян, но я надеюсь, что эта документация может помочь вам, ребята, помочь мне.

ОБНОВЛЕНИЕ:

Кажется, что pubsub и pubsub_v1 допустимы для использования, хотя я не уверен, в чем разница.

@ dustin Я сделал pip install -rrequire.txt, который в итоге соответствовал тому, что вы предоставили. Я также заметил ошибку при развертывании функции как 'hello-gcs-generic', которую следует заменить на 'callback'.

Теперь код Pythonхорошо работает локально, но развертывает егов облако с помощью приведенного выше кода (первая строка кода в OP) последовательно возвращает эту ошибку

ERROR: (gcloud.functions.deploy) OperationError: code=3, messa
ge=Function load error: Error: function load attempt timed out
.

Ответы [ 2 ]

0 голосов
/ 14 июня 2019

Существует более простой пример быстрого запуска Python , который делает то, что вам нужно.;-)

Пример, который вы цитируете, более продвинутый.Он показывает, как опубликовать сообщение с обработкой ошибок.Строка while(True): sleep(60) в расширенном примере предназначена для поддержки основного потока, если только не выдан Ctrl+C или его эквивалент для остановки работы программы.Причина, по которой эта функция sleep существует, заключается в том, что мы можем дождаться завершения обратных вызовов для фьючерсов публикации и не выходить из программы сразу после вызова публикации.Опять же, это, пожалуй, слишком сложно для того, что вы пытаетесь научиться делать с Cloud Pub / Sub с Cloud Functions.Я бы посоветовал держаться подальше от продвинутого примера и использовать пример быстрого старта.

from google.cloud import pubsub_v1

# TODO project_id = "Your Google Cloud Project ID"
# TODO topic_name = "Your Pub/Sub topic name"

publisher = pubsub_v1.PublisherClient()
# The `topic_path` method creates a fully qualified identifier
# in the form `projects/{project_id}/topics/{topic_name}`
topic_path = publisher.topic_path(project_id, topic_name)

for n in range(1, 10):
    data = u'Message number {}'.format(n)
    # Data must be a bytestring
    data = data.encode('utf-8')
    # When you publish a message, the client returns a future.
    future = publisher.publish(topic_path, data=data)
    print('Published {} of message ID {}.'.format(data, future.result()))

print('Published messages.')
0 голосов
/ 07 декабря 2018

Вам необходимо добавить google-cloud-pubsub в файл requirements.txt, а не в файл main.py.Это должно выглядеть так:

google-cloud-error-reporting==0.30.0
google-cloud-pubsub==0.38.0
...