Привет, Cloud Run с Python!

1. Введение

96d07289bb51daa7.png

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

Цель этого руководства — создать простое веб-приложение и развернуть его в 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 Console нажмите «Активировать Cloud Shell». 853e55310c205094.png .

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. Напишите заявку

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

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

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

mkdir ~/helloworld-python
cd ~/helloworld-python

main.py

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

touch main.py

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

10af7b1a6240e9f4.gif

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

cloudshell edit main.py

main.py

from flask import Flask, request

app = Flask(__name__)


@app.get("/")
def hello():
    """Return a friendly HTTP greeting."""
    who = request.args.get("who", default="World")
    return f"Hello {who}!\n"


if __name__ == "__main__":
    # Development only: run "python main.py" and open http://localhost:8080
    # When deploying to Cloud Run, a production-grade WSGI HTTP server,
    # such as Gunicorn, will serve the app.
    app.run(host="localhost", port=8080, debug=True)

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

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

Добавьте файл с именем requirements.txt , чтобы определить зависимости:

touch requirements.txt

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

cloudshell edit requirements.txt

requirements.txt

# https://pypi.org/project/flask
Flask==3.0.2

# https://pypi.org/project/gunicorn
gunicorn==21.2.0

Прокфайл

Наконец, добавьте файл с именем Procfile , чтобы указать, как приложение будет обслуживаться:

touch Procfile

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

cloudshell edit Procfile

Procfile

web: gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app

Убедитесь, что все файлы присутствуют в рабочем каталоге:

ls

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

main.py  Procfile  requirements.txt

Ваше приложение готово к развертыванию, но давайте сначала его протестируем...

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

Чтобы протестировать приложение, создайте виртуальную среду:

virtualenv venv

Активируйте виртуальную среду:

source venv/bin/activate

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

pip install -r requirements.txt

Вы должны получить подтверждающее сообщение, подобное следующему:

...
Successfully installed Flask ... gunicorn ...

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

python main.py

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

 * Serving Flask app 'main'
 * Debug mode: on
   WARNING: This is a development server.
   Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Running on http://localhost:8080
   Press CTRL+C to quit
...

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

6c9ff9e5c692c58e.gif

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

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

curl localhost:8080

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

Hello World!

Когда вы закончите, вернитесь в основной сеанс Cloud Shell и остановите команду python main.py нажав CTRL+C .

Выйдите из виртуальной среды:

deactivate

Наконец, удалите каталог виртуальной среды:

rm -r venv/

Ваше приложение работает как положено: давайте его развернем...

6. Развертывание в Cloud Run

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

REGION="europe-west9"

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

ls

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

main.py  Procfile  requirements.txt

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

gcloud run deploy helloworld-python \
  --source . \
  --platform managed \
  --region $REGION \
  --allow-unauthenticated
  • Вы можете определить регион по умолчанию с помощью этой команды: gcloud config set run/region $REGION
  • Вы также можете сделать Cloud Run управляемым по умолчанию с помощью этой команды: gcloud config set run/platform managed
  • Опция --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)?

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

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-python \
  --platform managed \
  --region $REGION \
  --format "value(status.url)" \
)
echo $SERVICE_URL

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

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

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

c836b93e5601e2cf.gif

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

curl $SERVICE_URL?who=me

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

Hello me!

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

7. Очистка

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

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

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

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

gcloud run services delete helloworld-python \
  --platform managed \
  --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

Вы создали простое веб-приложение и развернули его в Cloud Run!

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

Лицензия

Эта работа распространяется под лицензией Creative Commons Attribution 2.0 Generic License.