Как развернуть python облачную функцию Google с локальными зависимостями - PullRequest
1 голос
/ 07 мая 2020

У меня есть несколько google-cloud-functions, у которых есть общий код. Поэтому я решил создать пакет и поместить его в каждую из папок для своих функций. заканчиваясь следующей структурой каталогов

google-cloud-function
├── main.py
├── requirements.txt
└── helpers
    ├── tools.py
    └── __init__.py

Я выполнил Packaging Local Dependencies из документации, чтобы сделать свой пакет helpers. С моим requirements.txt следующим образом:

firebase-admin==4.0.0
google-cloud-storage==1.26.0
google-cloud-firestore==1.6.2

Функция развертывается правильно, но при запуске вылетает без журналов.
Это оператор импорта.

from helpers.tools import Event, CleanUpUser

Как я могу развернуть это python google-cloud-function соответственно?

ИЗМЕНИТЬ:
main.py

import firebase_admin
from google.cloud import firestore

from helpers.tools import Event

firebase_admin.initialize_app(options={'databaseURL': 'https://database_name.firebaseio.com/'})
firestore_db = firestore.Client()

EVENTS_NAME = 'database-events'


def user_cleanup(data, context):
    if Event(EVENTS_NAME).check_event(context):
        return 'Done'
    user_id = data['uid']
    user_ref = firestore_db.document(f'user_data/{user_id}')
    return 'Done'

tools.py

import logging
import sys
import traceback
from datetime import datetime

import firebase_admin
import pytz
from google.cloud import firestore


class Event:
    def __init__(self, database_name: str):
        init_logger()
        firebase_admin.initialize_app(options={'databaseURL': 'https://{database_name}.firebaseio.com/'})

    def check_event(self, context):
        event_id = context.event_id.replace('/', '--')
        timestamp = context.timestamp
        timestamp = timestamp[0:23] if len(timestamp) >= 24 else timestamp[0:19]
        try:
            millis = datetime.strptime(timestamp, '%Y-%m-%dT%H:%M:%S.%f').replace(tzinfo=pytz.utc).timestamp()*1000
        except ValueError:
            millis = datetime.strptime(timestamp, '%Y-%m-%dT%H:%M:%S').replace(tzinfo=pytz.utc).timestamp()*1000
        event_ref = firebase_admin.db.reference().child(event_id)
        event = event_ref.get()
        if not event:
            event_ref.set({
                'timestamp': millis
            })
            return False
        else:
            logging.warning('Event already in the list, exiting this instance.')
            return True

РЕДАКТИРОВАТЬ: Моя проблема что я не форматировал databaseURL, добавляя f, но все же я смог отладить это, используя try/catch, журналы никогда не показывали причину ошибки только ...finished with status: 'crash', открыли проблему в GitHub

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