Hello Cloud Run с Python (FastAPI)

1. Введение

96d07289bb51daa7.png

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

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

Что вы узнаете

  • Как создать приложение FastAPI "Hello World".
  • Тестирование приложения путем запуска сервера FastAPI в режиме dev .
  • Облачные Buildpack и то, как наличие fastapi и uvicorn в requirements.txt позволяет обойтись без Dockerfile.
  • Как развернуть приложение FastAPI в Cloud Run.

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

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

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

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Название проекта — это отображаемое имя участников данного проекта. Это строка символов, не используемая API Google. Вы всегда можете его изменить.
  • Идентификатор проекта уникален для всех проектов Google Cloud и является неизменяемым (его нельзя изменить после установки). Консоль Cloud автоматически генерирует уникальную строку; обычно вам неважно, какая она. В большинстве практических заданий вам потребуется указать идентификатор вашего проекта (обычно обозначается как PROJECT_ID ). Если сгенерированный идентификатор вас не устраивает, вы можете сгенерировать другой случайный идентификатор. В качестве альтернативы вы можете попробовать свой собственный и посмотреть, доступен ли он. После этого шага его нельзя изменить, и он сохраняется на протяжении всего проекта.
  • К вашему сведению, существует третье значение — номер проекта , которое используется некоторыми API. Подробнее обо всех трех значениях можно узнать в документации .
  1. Далее вам потребуется включить оплату в консоли Cloud для использования ресурсов/API Cloud. Выполнение этого практического задания не потребует больших затрат, если вообще потребует. Чтобы отключить ресурсы и избежать дополнительных расходов после завершения этого урока, вы можете удалить созданные ресурсы или удалить проект. Новые пользователи 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 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 Editor:

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-запросы понятным сообщением.

requirements.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 не взимает плату, когда услуга не используется, с вас все равно может взиматься плата за хранение образа контейнера в реестре артефактов. Вы можете удалить свой репозиторий или проект 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 .
  • Облачные Buildpack и то, как наличие fastapi и uvicorn в requirements.txt позволяет обойтись без Dockerfile.
  • Развертывание приложения FastAPI в Cloud Run.

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