Запуск заданий Cloud Run с помощью Cloud Scheduler

1. Обзор

В ходе этой лабораторной работы вы создадите задание Cloud Run и настроите задание Cloud Scheduler . Вы развернете службу меню Cymbal Eats, используя сценарий установки. Вы создадите задание Cloud Run, которое будет выполнять вызовы API к службе меню Cymbal Eats. Вы выполните задание с помощью Google Cloud CLI и настроите расписание для задания. Вы проверите выполнение, просмотрев журналы и выполнив вызовы API к службе меню, чтобы подтвердить, что элементы меню были удалены.

Что такое вакансии Cloud Run?

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

Работа по уборке

Задание службы очистки извлечет элементы меню в состоянии «Сбой» и удалит их. Когда создаются новые пункты меню, изображения анализируются с помощью Vision API, чтобы определить, является ли это продуктом питания или нет. Для изображений, не прошедших эту проверку, статус пунктов меню будет изменен на «Не выполнено», а затем удален в ходе задания очистки.

d74200f0bd14d350.png

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

В этой лабораторной работе вы научитесь делать следующее:

  • Создание заданий Cloud Run
  • Выполнение заданий Cloud Run
  • Создание заданий облачного планировщика
  • Проверка выполнения заданий

Предварительные условия

  • Эта лабораторная работа предполагает знакомство с облачной консолью и средами оболочки.
  • Предыдущий опыт Cloud Run и Cloud Scheduler будет полезен, но не обязателен.

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

Настройка облачного проекта

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

Настройка среды

Активируйте Cloud Shell, щелкнув значок справа от панели поиска.

eb0157a992f16fa3.png

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

git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/menu-service

Разверните службу меню с помощью сценария установки в Cloud Run. Служба меню — это микрослужба на основе Java, созданная с помощью платформы Quarkus и использующая в качестве серверной части базу данных Cloud SQL Postgres. Служба меню является зависимостью времени выполнения для задания Cloud Run, которое вы создадите на следующих шагах.

./setup.sh

Развертывание займет около 10 минут для создания всех необходимых компонентов.

Перейдите к следующим шагам после выполнения приведенной выше команды.

3. Изучите код задания Cloud Run.

Откройте новую вкладку в Cloud Shell, щелкнув значок плюса.

45f480cd1b9a995.png

Перейдите в каталог, содержащий службу очистки, и просмотрите файлы, составляющие задание:

cd ~/cymbal-eats/cleanup-service

Служба очистки в этом каталоге содержит Dockerfile , который определяет образ контейнера для задания службы очистки с необходимыми зависимостями (httpie, jq).

Докерфайл

FROM ubuntu:latest 
RUN apt-get update && apt-get install -y httpie jq && apt-get clean
COPY script.sh /
RUN chmod +x /script.sh
CMD ["/script.sh"]
ENTRYPOINT ["/bin/bash"]

Фактический сценарий очистки, указанный ниже, содержит команды для получения списка элементов меню в состоянии сбоя и их удаления путем выполнения вызовов API к службе меню.

скрипт.sh

echo "FAILED_ITEM_AGE=$FAILED_ITEM_AGE"
echo "MENU_SERVICE_URL=$MENU_SERVICE_URL"
# Failed items older than FAILED_ITEM_AGE in minutes
for id in $(http GET $MENU_SERVICE_URL/menu/failed | jq '[.[] | select(.updateDateTime < ((now - 60 * (env.FAILED_ITEM_AGE | tonumber) )| strftime("%Y-%m-%dT%H:%M:%S.%f")))]'| jq '.[].id'); do
  echo "Deleting Menu Item : $MENU_SERVICE_URL/menu/$id"
  http GET $MENU_SERVICE_URL/menu/$id
  http DELETE $MENU_SERVICE_URL/menu/$id
done

# Processing items older than FAILED_ITEM_AGE in minutes
for id in $(http GET $MENU_SERVICE_URL/menu/processing | jq '[.[] | select(.updateDateTime < ((now - 60 * (env.FAILED_ITEM_AGE | tonumber))| strftime("%Y-%m-%dT%H:%M:%S.%f")))]'| jq '.[].id'); do
  echo "Deleting Menu Item : $MENU_SERVICE_URL/menu/$id"
  http GET $MENU_SERVICE_URL/menu/$id
  http DELETE $MENU_SERVICE_URL/menu/$id
done

Обратите внимание на следующее в сценарии:

  • Переменные среды FAILED_ITEM_AGE и MENU_SERVICE_URL будут установлены во время развертывания и переданы заданием Cloud Run.
  • FAILED_ITEM_AGE — количество минут до удаления элемента с ошибкой.
  • MENU_SERVICE_URL — URL-адрес сервиса Cymbal Eats Menu.

4. Создайте задание запуска в облаке

Далее вы создадите образ контейнера и опубликуете его в реестре артефактов.

Этот образ контейнера будет использоваться для создания задания Cloud Run.

Включите сервисные API:

gcloud services enable \
    run.googleapis.com \
    artifactregistry.googleapis.com \
    cloudscheduler.googleapis.com \
    --quiet

Установите переменные среды:

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export PROJECT_NAME=$(gcloud projects describe $PROJECT_ID --format='value(name)')
export REGION=us-east1
export MENU_SERVICE_NAME=menu-service

Создайте новый репозиторий реестра артефактов для хранения образов Docker для задания очистки:

gcloud artifacts repositories create cymbal-eats --repository-format=docker --location=$REGION

Создайте образ контейнера с помощью Cloud Build и отправьте его в реестр артефактов с помощью одной команды:

gcloud builds submit -t $REGION-docker.pkg.dev/$PROJECT_NAME/cymbal-eats/cleanup-service:latest

Пример вывода:

DURATION: 35S
SOURCE: gs://cymbal-eats-14906-569_cloudbuild/source/1657126400.933586-dc3e91ec85934a55bb6d2f7012611365.tgz
IMAGES: us-east1-docker.pkg.dev/cymbal-eats-14906-569/cymbal-eats/cleanup-service (+1 more)
STATUS: SUCCESS

После завершения публикации перейдите в реестр артефактов и просмотрите опубликованное изображение:

fb95ae38baa7c543.png

Вернитесь на вторую вкладку Cloud Shell. Выполните следующую команду, чтобы описать службу меню и сохранить URL-адрес в переменной среды. Эта переменная среды будет использоваться для настройки задания Cloud Run.

MENU_SERVICE_URL=$(gcloud run services describe $MENU_SERVICE_NAME \
 --region=$REGION \
 --format=json | jq \
 --raw-output ".status.url")

Создайте задание Cloud Run для очистки ошибочных элементов меню старше 1 минуты [установлено FAILED_ITEM_AGE ].

gcloud beta run jobs create cleanup-service \
  --image=$REGION-docker.pkg.dev/$PROJECT_NAME/cymbal-eats/cleanup-service:latest \
  --set-env-vars MENU_SERVICE_URL=$MENU_SERVICE_URL \
  --set-env-vars FAILED_ITEM_AGE=1 \
  --region $REGION

Пример вывода:

Creating Cloud Run job [cleanup-service] in project [cymbal-eats] region [us-east1]
OK Creating job... Done.
Done.
Job [cleanup-service] has successfully been created.

Перейдите в раздел Cloud Run JOBS в консоли и просмотрите созданное задание.

Нажмите на задание и изучите доступные вкладки: ИСТОРИЯ, ЖУРНАЛЫ, КОНФИГУРАЦИЯ и YAML.

b12c8e312de3b66.png

Убедитесь, что переменные среды были установлены, просмотрев раздел КОНФИГУРАЦИЯ задания в консоли:

724c2919d05349c8.png

(Необязательно) Если вы хотите изменить переменные «Возраст невыполненного элемента» или «URL-адрес службы меню», после создания задания Cloud Run вы можете использовать команду обновления:

gcloud beta run jobs update cleanup-service \
  --image=$REGION-docker.pkg.dev/$PROJECT_NAME/cymbal-eats/cleanup-service:latest \
  --set-env-vars MENU_SERVICE_URL=$MENU_SERVICE_URL \
  --set-env-vars FAILED_ITEM_AGE=1 \
  --region $REGION

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

gcloud beta run jobs execute cleanup-service --region=$REGION

Пример вывода:

OK Creating execution... Done.                                   
  OK Provisioning resources...
Done.
Execution [cleanup-service-rlxs4] has successfully started running.

View details about this execution by running:
gcloud beta run jobs executions describe cleanup-service-rlxs4
 

Перейдите на вкладку ЖУРНАЛЫ, чтобы просмотреть выходные данные задания. В журналах вы должны увидеть возраст сбойного элемента и URL-адрес службы меню.

518cb00036a2561f.png

5. Настройте расписание выполнения задания в облаке.

Cloud Scheduler — это полностью управляемый планировщик заданий cron корпоративного уровня. Он позволяет планировать практически любое задание, включая пакетные задания, задания с большими данными, операции облачной инфраструктуры и многое другое.

Одна из рекомендаций по безопасности при работе с заданием облачного планировщика — выполнять каждое задание с отдельными учетными данными. На этом этапе создайте учетную запись службы для использования заданием планировщика очистки.

export SCHEDULER_SERVICE_ACCOUNT=cleanup-scheduler-job-sa

gcloud iam service-accounts create ${SCHEDULER_SERVICE_ACCOUNT}

Заданию Cloud Scheduler потребуются разрешения на вызовы заданий Cloud Run.

Предоставьте роль Cloud Run Invoker сервисному аккаунту, который используется в задании Cloud Scheduler:

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
  --member="serviceAccount:${SCHEDULER_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
  --role="roles/run.invoker"

Далее вы настроите расписание для запуска задания службы очистки.

Cloud Scheduler поддерживает несколько типов целей .

  • HTTP
  • Паб/Саб
  • Механизм приложений HTTP

Вы создадите задание планировщика, используя целевой тип HTTP.

В демонстрационных целях вы запланируете его запуск каждые 5 минут.

gcloud scheduler jobs create http cleanup-schedule \
    --location $REGION \
    --schedule="*/5 * * * *" \
    --uri="https://$REGION-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/$PROJECT_ID/jobs/cleanup-service:run" \
    --http-method POST \
    --oauth-service-account-email ${SCHEDULER_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com

Просмотрите параметр uri , который используется для вызова задания Cloud Run:

  • REGION и PROJECT_ID — регион Cloud Run и идентификатор проекта, в котором развернуто задание службы очистки.
  • cleanup-service — имя задания облачного запуска.

Перейдите в Cloud Scheduler в консоли, чтобы просмотреть созданное задание планировщика:

3bc9120df7fc6ed.png

Просмотрите доступные параметры в меню «Действия».

7945908025dd2f2b.png

6. Тестовое выполнение задания в облаке

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

curl ${MENU_SERVICE_URL}/menu | jq

Выход:

Вы увидите 3 пункта меню в состоянии Ready ».

Измените статус пункта меню № 1 на Failed :

curl -X PUT "${MENU_SERVICE_URL}/menu/1" \
  -H 'Content-Type: application/json' \
  -d '{"status": "Failed"}' | jq

Подождите 1 минуту. Чтобы элемент меню был удален, ему должна быть 1 минута, как установлено параметром FAILED_ITEM_AGE .

Вы можете дождаться следующего запланированного запуска или принудительно выполнить задание с консоли.

Существует несколько способов запустить задание: через пользовательский интерфейс или из командной строки.

В этом примере выполните команду в Cloud Shell (вариант № 3), чтобы запустить задание.

  1. Из Cloud Scheduler , выбрав «Принудительный запуск задания» в меню «Действия».

6c8cbeae6165ba4a.png

  1. Из облака выполните задание , нажав кнопку «ВЫПОЛНИТЬ».

229c22288882b5c3.png

  1. Из Cloud Shell выполнив следующую команду:
gcloud beta run jobs execute cleanup-service --region=$REGION

Перейдите в раздел Cloud Run JOBS, откройте вкладку ЖУРНАЛЫ и убедитесь, что этот пункт меню удален.

50829ae27b135b2d.png

Фильтруйте журналы по ключевому слову «удаление», чтобы найти журналы.

d94fb9e444b1c1b8.png

Используйте конечные точки службы меню для проверки существующих пунктов меню через конечную точку REST.

curl ${MENU_SERVICE_URL}/menu | jq

Выход:

Вы увидите 2 пункта меню в состоянии Ready ».

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

Поздравляем, вы завершили работу над кодом!

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

  • Как создавать задания Cloud Run
  • Как выполнять задания Cloud Run
  • Как создавать задания Cloud Scheduler
  • Как проверить выполнение заданий

Что дальше:

Ознакомьтесь с другими лабораториями Cymbal Eats:

Очистить

Чтобы избежать списания средств с вашей учетной записи Google Cloud за ресурсы, используемые в этом руководстве, либо удалите проект, содержащий ресурсы, либо сохраните проект и удалите отдельные ресурсы.

Удаление проекта

Самый простой способ избавиться от выставления счетов — удалить проект, созданный вами для этого руководства.