1. Обзор
В этой лабораторной работе вы создадите задание Cloud Run и настроите задание Cloud Scheduler . Вы развернете службу меню Cymbal Eats, используя скрипт настройки. Вы создадите задание Cloud Run, которое будет выполнять вызовы API к службе меню Cymbal Eats. Вы выполните задание с помощью Google Cloud CLI и настроите расписание для него. Вы проверите выполнение, просмотрев журналы и выполнив вызовы API к службе меню, чтобы убедиться, что пункты меню были удалены.
Что такое задания Cloud Run?
В задании Cloud Run запускается контейнер, который не обрабатывает веб-запросы, а выполняет операционные задачи или обработку данных. Контейнер выполнит задачу и завершит работу по её завершении.
Услуги по уборке
Задача службы очистки получит пункты меню со статусом «Неудачно» и удалит их. При создании новых пунктов меню изображения анализируются с помощью Vision API для определения, являются ли они продуктами питания или нет. Для изображений, не прошедших эту проверку, статус пунктов меню будет обновлен до «Неудачно», и они будут удалены задачей очистки.

Что вы узнаете
В этой лабораторной работе вы научитесь выполнять следующие действия:
- Создание заданий Cloud Run
- Выполнить задания Cloud Run
- Создание заданий планировщика облачных задач
- Проверка выполнения заданий
Предварительные требования
- Для выполнения этой лабораторной работы предполагается знакомство с Cloud Console и командной оболочкой.
- Опыт работы с Cloud Run и Cloud Scheduler приветствуется, но не является обязательным.
2. Настройка и требования
Настройка облачного проекта
- Войдите в консоль Google Cloud и создайте новый проект или используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .



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

В 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, нажав на значок плюса.

Перейдите в каталог, содержащий службу очистки, и просмотрите файлы, составляющие задачу:
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
После завершения публикации перейдите в Реестр артефактов и просмотрите опубликованное изображение:

Вернитесь на вторую вкладку 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.

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

(Необязательно) Если вы хотите изменить переменные «Возраст неисправного элемента» или «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-адрес службы меню.

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.
Перейдите в раздел «Планировщик заданий» в консоли, чтобы просмотреть созданное задание планировщика:

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

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), чтобы запустить задание.
- В Cloud Scheduler выберите пункт "Принудительное выполнение задания" в меню "Действия".

- Для запуска задания в облаке нажмите кнопку "ВЫПОЛНИТЬ".

- В оболочке Cloud Shell выполните следующую команду:
gcloud beta run jobs execute cleanup-service --region=$REGION
Перейдите в раздел Cloud Run JOBS, откройте вкладку LOGS и убедитесь, что пункт меню был удален.

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

Используйте конечные точки службы меню для проверки существующих пунктов меню через конечную точку REST.
curl ${MENU_SERVICE_URL}/menu | jq
Выход:
В статусе Ready вы увидите 2 пункта меню.
7. Поздравляем!
Поздравляем, вы завершили практическое занятие!
Что мы рассмотрели:
- Как создавать задания Cloud Run
- Как запускать задания Cloud Run
- Как создавать задания в Cloud Scheduler
- Как проверить выполнение заданий
Что дальше:
Ознакомьтесь с другими обучающими материалами Cymbal Eats:
- Запуск облачных рабочих процессов с помощью Eventarc
- Запуск обработки событий из облачного хранилища.
- Подключение к частному серверу CloudSQL из Cloud Run
- Подключение к полностью управляемым базам данных из Cloud Run
- Защита бессерверного приложения с помощью прокси-сервера с поддержкой идентификации (IAP)
- Безопасное развертывание в облаке
- Обеспечение безопасности входящего трафика облачных сервисов
- Подключение к частной базе данных AlloyDB из GKE Autopilot
Уборка
Чтобы избежать списания средств с вашего аккаунта Google Cloud за ресурсы, используемые в этом руководстве, либо удалите проект, содержащий эти ресурсы, либо сохраните проект и удалите отдельные ресурсы.
Удаление проекта
Самый простой способ избежать выставления счетов — удалить проект, созданный для этого урока.