Идея заключается в следующем:

Вместо сборки и повторного развертывания при каждом изменении, при каждом запросезагружайте файл main.py и запускайте это. Несколько кратких вопросов:

Где бы я разместил свой основной файл?

Облачное хранилище Google / AWS S3

Не увеличится ли время обработки при извлечении файла после запроса?

Не совсем. В идеале вы должны развернуть Google Cloud Storage и Cloud Run в одном регионе. Преимущества включают хранение и обработку в одном месте. Это выгодно, так как бесплатно.

Время ответа на запрос также ничтожно мало, так как поездка туда и обратно осуществляется из одного и того же места. Типичный файл Python для микросервиса не такой большой; минимизация времени запроса.

Как я буду запускать это в моей предпочтительной среде разработки?

Вот мясо и картошка из него.

Теперь откройте свой любимый редактор; мы будем использовать наш предыдущий код.

main.py:

# main.py
# pip install fastapi uvicorn
import uvicorn
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def root():
    return {"message": "Hello World"}

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8080)

Докерфайл:

FROM --platform=amd64 ubuntu:20.04
RUN apt-get update
RUN apt-get install -y python3-pip
RUN pip3 install python-multipart
RUN pip3 install fastapi
RUN pip3 install uvicorn
RUN apt-get install -y tini

RUN apt-get clean
COPY . /app
EXPOSE 8080

ENTRYPOINT ["/usr/bin/tini", "--"]
CMD ["python3",  "app/main.py"]

Нам нужно отправлять наш файл main.py каждый раз, когда мы запускаем наш код из редактора. В документах Google есть отличный стартовый код.

from google.cloud import storage
import os, sys

def upload_blob(bucket_name, source_file_name, destination_blob_name):
    # where to find the credentials. 
    if sys.platform == 'linux':
        os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = '/app/creds.json'
    else:
        os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = 'creds.json'


    """Uploads a…