Hello Cloud Run с Python (FastAPI)

1. Введение

96d07289bb51daa7.png

Cloud Run — это управляемая вычислительная платформа, позволяющая запускать контейнеры без сохранения состояния, вызываемые с помощью HTTP-запросов. Она построена на базе проекта с открытым исходным кодом Knative , что обеспечивает переносимость рабочих нагрузок между платформами. Cloud Run работает без сервера: он абстрагируется от всего управления инфраструктурой, позволяя вам сосредоточиться на самом важном — создании эффективных приложений.

Целью данного руководства является создание простого веб-приложения FastAPI и его развертывание в Cloud Run.

Чему вы научитесь

  • Как создать FastAPI-приложение «Hello World».
  • Тестирование приложения путем запуска сервера FastAPI в режиме dev .
  • Cloud Buildpacks и как наличие fastapi и uvicorn в файле requirements.txt позволяет обойтись без Dockerfile.
  • Как развернуть приложение FastAPI в Cloud Run.

2. Настройка и требования

Настройка среды для самостоятельного обучения

  1. Войдите в Google Cloud Console и создайте новый проект или используйте существующий. Если у вас ещё нет учётной записи Gmail или Google Workspace, вам необходимо её создать .

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Название проекта — отображаемое имя участников проекта. Это строка символов, не используемая API Google. Вы можете изменить её в любой момент.
  • Идентификатор проекта уникален для всех проектов Google Cloud и неизменяем (нельзя изменить после установки). Cloud Console автоматически генерирует уникальную строку; обычно вам не важно, какой именно. В большинстве практических работ вам потребуется указать идентификатор проекта (обычно обозначаемый как PROJECT_ID ). Если вам не нравится сгенерированный идентификатор, вы можете сгенерировать другой случайный идентификатор. Вы также можете попробовать использовать свой собственный идентификатор и посмотреть, доступен ли он. После этого шага его нельзя будет изменить, и он останется на протяжении всего проекта.
  • К вашему сведению, существует третье значение — номер проекта , который используется некоторыми API. Подробнее обо всех трёх значениях можно узнать в документации .
  1. Далее вам нужно включить биллинг в Cloud Console для использования облачных ресурсов/API. Выполнение этой лабораторной работы не потребует больших затрат, если вообще потребует. Чтобы отключить ресурсы и избежать списания средств за пределами этого руководства, вы можете удалить созданные вами ресурсы или проект. Новые пользователи Google Cloud могут воспользоваться бесплатной пробной версией стоимостью 300 долларов США .

Запустить Cloud Shell

Хотя Google Cloud можно управлять удаленно с вашего ноутбука, в этом руководстве вы будете использовать Cloud Shell — среду командной строки, работающую в облаке.

Активировать Cloud Shell

  1. В консоли Cloud нажмите «Активировать Cloud Shell» .

3c1dabeca90e44e5.png

Если вы запускаете Cloud Shell впервые, вам будет показан промежуточный экран с описанием его функций. Если вы увидели промежуточный экран, нажмите «Продолжить» .

9c92662c6a846a5c.png

Подготовка и подключение к Cloud Shell займет всего несколько минут.

9f0e51b578fecce5.png

Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Она предоставляет постоянный домашний каталог объёмом 5 ГБ и работает в Google Cloud, что значительно повышает производительность сети и аутентификацию. Значительную часть работы, если не всю, в этой лабораторной работе можно выполнить в браузере.

После подключения к Cloud Shell вы увидите, что вы прошли аутентификацию и проекту присвоен идентификатор вашего проекта.

  1. Выполните следующую команду в Cloud Shell, чтобы подтвердить, что вы прошли аутентификацию:
gcloud auth list

Вывод команды

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Выполните следующую команду в Cloud Shell, чтобы подтвердить, что команда gcloud знает о вашем проекте:
gcloud config list project

Вывод команды

[core]
project = <PROJECT_ID>

Если это не так, вы можете установить его с помощью этой команды:

gcloud config set project <PROJECT_ID>

Вывод команды

Updated property [core/project].

3. Включите API

В Cloud Shell включите API Artifact Registry, Cloud Build и Cloud Run:

gcloud services enable \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  run.googleapis.com

В результате выводится сообщение об успешном выполнении, похожее на это:

Operation "operations/..." finished successfully.

Теперь вы готовы приступить к работе и написать заявление...

4. Написать заявление

На этом этапе вы создадите приложение FastAPI Python «Hello World», отвечающее на HTTP-запросы.

Рабочий каталог

Используйте Cloud Shell для создания рабочего каталога с именем helloworld-fastapi и переключитесь на него:

mkdir ~/helloworld-fastapi && cd ~/helloworld-fastapi

main.py

Создайте файл с именем main.py :

touch main.py

Отредактируйте файл с помощью предпочитаемого вами редактора командной строки (nano, vim или emacs) или нажав кнопку «Редактор Cloud Shell»:

10af7b1a6240e9f4.gif

Чтобы напрямую редактировать файл с помощью Cloud Shell Editor, используйте следующую команду:

cloudshell edit main.py

main.py

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def hello(name: str = "World"):
    """Return a friendly HTTP greeting."""
    return {
        "message": f"Hello {name}!"
    }

Этот код создает базовую веб-службу, отвечающую на HTTP-запросы GET дружественным сообщением.

требования.txt

Снова откройте терминал и добавьте файл с именем requirements.txt для определения зависимостей:

touch requirements.txt

Чтобы напрямую редактировать файл с помощью Cloud Shell Editor, используйте следующую команду:

cloudshell edit requirements.txt

requirements.txt

# https://pypi.org/project/fastapi
fastapi[standard]==0.116.1

# https://pypi.org/project/uvicorn
uvicorn==0.35.0

Приложение FastAPI готово к развертыванию, но сначала его нужно протестировать...

5. Протестируйте приложение

Для тестирования приложения используйте uv (чрезвычайно быстрый менеджер пакетов и проектов Python), который предварительно установлен в Cloud Shell.

Для тестирования приложения создайте виртуальную среду:

uv venv

Установите зависимости:

uv pip install -r requirements.txt

Запустите приложение в режиме dev :

uv run fastapi dev main.py --port=8080

Логи показывают, что вы находитесь в режиме разработки:

FastAPI   Starting development server 🚀

          Searching for package file structure from directories with __init__.py files
          Importing from /home/user/code/helloworld-fastapi

  module  🐍 main.py

    code  Importing the FastAPI app object from the module with the following code:

          from main import app

     app  Using import string: main:app

  server   Server started at http://127.0.0.1:8080
  server   Documentation at http://127.0.0.1:8080/docs

     tip   Running in development mode, for production use: fastapi run

           Logs:

    INFO   Will watch for changes in these directories: ['/home/user/code/helloworld-fastapi']
    INFO   Uvicorn running on http://127.0.0.1:8080 (Press CTRL+C to quit)
    INFO   Started reloader process [19627] using WatchFiles
    INFO   Started server process [19629]
    INFO   Waiting for application startup.
    INFO   Application startup complete.

В окне Cloud Shell щелкните значок Web Preview и выберите Preview on port 8080 :

6c9ff9e5c692c58e.gif

Должно открыться окно браузера с сообщением Hello World!

Вы также можете открыть еще один сеанс Cloud Shell (новую вкладку терминала), нажав значок + и отправив веб-запрос приложению, работающему локально:

curl localhost:8080

Вы должны получить следующий ответ:

{"message": "Hello World!"}

После завершения вернитесь в основной сеанс Cloud Shell и остановите сервер разработки FastAPI с помощью сочетания CTRL+C .

Приложение работает так, как и ожидалось: пора его развернуть...

6. Развертывание в облаке.

Cloud Run является региональным, то есть инфраструктура, на которой работают ваши сервисы Cloud Run, расположена в определённом регионе и управляется Google, обеспечивая резервный доступ во всех зонах этого региона. Определите регион, который вы будете использовать для развёртывания, например:

REGION=europe-west1

Убедитесь, что вы все еще находитесь в рабочем каталоге:

ls

В списке должны быть следующие файлы:

main.py  requirements.txt

Перед развертыванием создайте файл .gcloudignore с расширением .venv/ . Это предотвратит включение в развертывание Cloud Run виртуальной среды, созданной с помощью uv во время локального тестирования.

Создайте .gcloudignore с помощью следующей команды:

echo ".venv/" > .gcloudignore

Разверните приложение в Cloud Run:

gcloud run deploy helloworld-fastapi \
  --source . \
  --region $REGION \
  --allow-unauthenticated
  • Параметр --allow-unauthenticated делает службу общедоступной. Чтобы избежать неаутентифицированных запросов, используйте вместо него --no-allow-unauthenticated .

При первом запуске вам будет предложено создать репозиторий реестра артефактов. Нажмите Enter для подтверждения:

Deploying from source requires an Artifact Registry Docker repository to store
built containers. A repository named [cloud-run-source-deploy] in region [REGION]
will be created.

Do you want to continue (Y/n)?

Это запустит загрузку вашего исходного кода в репозиторий Artifact Registry и сборку вашего образа контейнера:

Building using Buildpacks and deploying container ...
* Building and deploying new service... Building Container.           
  OK Creating Container Repository...
  OK Uploading sources...
  * Building Container... Logs are available at ...

Затем подождите немного, пока развёртывание завершится. В случае успешного завершения в командной строке отобразится URL-адрес сервиса:

...
OK Building and deploying new service... Done.
  OK Creating Container Repository...
  OK Uploading sources...
  OK Building Container... Logs are available at ...
  OK Creating Revision... Creating Service.
  OK Routing traffic...
  OK Setting IAM Policy...
Done.
Service [SERVICE]... has been deployed and is serving 100 percent of traffic.
Service URL: https://SERVICE-PROJECTHASH-REGIONID.a.run.app

Получить URL-адрес сервиса можно с помощью этой команды:

SERVICE_URL=$( \
  gcloud run services describe helloworld-fastapi \
  --region $REGION \
  --format "value(status.address.url)" \
)
echo $SERVICE_URL

Должно отобразиться что-то вроде следующего:

https://helloworld-fastapi-PROJECTHASH-REGIONID.a.run.app

Теперь вы можете использовать свое приложение, открыв URL-адрес сервиса в веб-браузере:

helloworld-fastapi.gif

Вы также можете вызвать приложение из Cloud Shell:

curl $SERVICE_URL?name=me

Это должно дать вам ожидаемое приветствие:

{"message": "Hello me!"}

Поздравляем! Вы только что развернули приложение в Cloud Run. Cloud Run автоматически горизонтально масштабирует ваш образ контейнера для обработки полученных запросов, а затем уменьшает его при снижении нагрузки. Вы платите только за ресурсы процессора, памяти и сети, потребляемые при обработке запросов для этого сервиса Cloud Run.

7. Уборка

Хотя Cloud Run не взимает плату, когда сервис не используется, с вас может всё равно взиматься плата за хранение образа контейнера в Artifact Registry. Вы можете удалить свой репозиторий или проект Cloud, чтобы избежать оплаты. Удаление проекта Cloud прекращает взимание платы за все ресурсы, используемые в этом проекте.

Чтобы удалить репозиторий образов контейнеров:

gcloud artifacts repositories delete cloud-run-source-deploy \
  --location $REGION

Чтобы удалить службу Cloud Run:

gcloud run services delete helloworld-fastapi \
  --region $REGION

Чтобы удалить свой проект Google Cloud,

  1. Получите текущий идентификатор проекта:
PROJECT_ID=$(gcloud config get-value core/project)
  1. Убедитесь, что это тот проект, который вы хотите удалить:
echo $PROJECT_ID
  1. Удалить проект:
gcloud projects delete $PROJECT_ID

8. Поздравляем!

96d07289bb51daa7.png

Вы создали веб-приложение FastAPI «Hello World» и развернули его в Cloud Run!

Что мы рассмотрели

  • Как создать FastAPI-приложение «Hello World».
  • Тестирование приложения путем запуска сервера FastAPI в режиме dev .
  • Cloud Buildpacks и как наличие fastapi и uvicorn в файле requirements.txt позволяет обойтись без Dockerfile.
  • Развертывание приложения FastAPI в Cloud Run.

Узнать больше