Запуск заданий 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 Console и командной оболочкой.
  • Опыт работы с Cloud Run и Cloud Scheduler приветствуется, но не является обязательным.

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

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

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

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

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

eb0157a992f16fa3.png

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

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

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

./setup.sh

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

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

3. Изучите код Cloud Run Job.

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

45f480cd1b9a995.png

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

cd ~/cymbal-eats/cleanup-service

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

Dockerfile

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 к службе Menu.

скрипт.ш

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.

4. Создайте задание Cloud Run.

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

Этот образ контейнера будет использоваться для создания задания 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. Выполните следующую команду, чтобы описать службу Menu и сохранить 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» в консоли и просмотрите созданное задание.

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

b12c8e312de3b66.png

Убедитесь, что переменные среды установлены, просмотрев раздел CONFIGURATION задания в консоли:

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 Run.

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

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

export SCHEDULER_SERVICE_ACCOUNT=cleanup-scheduler-job-sa

gcloud iam service-accounts create ${SCHEDULER_SERVICE_ACCOUNT}

Для выполнения вызовов заданий Cloud Run Jobs в рамках Cloud Scheduler потребуются соответствующие разрешения.

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

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
  • Паб/Саб
  • App Engine 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 Run.

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

3bc9120df7fc6ed.png

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

7945908025dd2f2b.png

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

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

curl ${MENU_SERVICE_URL}/menu | jq

Выход:

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

Изменить статус пункта меню №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, откройте вкладку LOGS и убедитесь, что пункт меню был удален.

50829ae27b135b2d.png

Для поиска нужных записей в логах используйте фильтр по ключевому слову "deleting".

d94fb9e444b1c1b8.png

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

curl ${MENU_SERVICE_URL}/menu | jq

Выход:

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

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

Поздравляем, вы завершили практическое занятие!

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

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

Что дальше:

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

Уборка

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

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

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