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 Run и Cloud Scheduler будет полезен, но не обязателен.
2. Настройка и требования
Настройка облачного проекта
- Войдите в Google Cloud Console и создайте новый проект или повторно используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .
- Имя проекта — это отображаемое имя для участников этого проекта. Это строка символов, не используемая API Google. Вы можете обновить его в любое время.
- Идентификатор проекта уникален для всех проектов Google Cloud и является неизменяемым (нельзя изменить после его установки). Cloud Console автоматически генерирует уникальную строку; обычно тебя не волнует, что это такое. В большинстве лабораторий кода вам потребуется указать идентификатор проекта (обычно он обозначается как
PROJECT_ID
). Если вам не нравится сгенерированный идентификатор, вы можете создать другой случайный идентификатор. Кроме того, вы можете попробовать свой собственный и посмотреть, доступен ли он. Его нельзя изменить после этого шага, и он останется в силе на протяжении всего проекта. - К вашему сведению, есть третье значение — номер проекта , который используют некоторые API. Подробнее обо всех трех этих значениях читайте в документации .
- Затем вам необходимо включить выставление счетов в Cloud Console, чтобы использовать облачные ресурсы/API. Прохождение этой лаборатории кода не должно стоить много, если вообще стоит. Чтобы отключить ресурсы и не платить за выставление счетов за пределами этого руководства, вы можете удалить созданные вами ресурсы или удалить весь проект. Новые пользователи Google Cloud имеют право на участие в программе бесплатной пробной версии стоимостью 300 долларов США .
Настройка среды
Активируйте Cloud Shell, щелкнув значок справа от панели поиска.
В 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, щелкнув значок плюса.
Перейдите в каталог, содержащий службу очистки, и просмотрите файлы, составляющие задание:
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
После завершения публикации перейдите в реестр артефактов и просмотрите опубликованное изображение:
Вернитесь на вторую вкладку 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.
Убедитесь, что переменные среды были установлены, просмотрев раздел КОНФИГУРАЦИЯ задания в консоли:
(Необязательно) Если вы хотите изменить переменные «Возраст элемента с ошибкой» или «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 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 в консоли, чтобы просмотреть созданное задание планировщика:
Просмотрите доступные параметры в меню «Действия».
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), чтобы запустить задание.
- Из Cloud Scheduler , выбрав «Принудительный запуск задания» в меню «Действия».
- Из облака выполните задание , нажав кнопку «ВЫПОЛНИТЬ».
- Из Cloud Shell выполнив следующую команду:
gcloud beta run jobs execute cleanup-service --region=$REGION
Перейдите в раздел Cloud Run JOBS, откройте вкладку ЖУРНАЛЫ и убедитесь, что этот пункт меню удален.
Фильтруйте журналы по ключевому слову «удаление», чтобы найти журналы.
Используйте конечные точки службы меню для проверки существующих пунктов меню через конечную точку REST.
curl ${MENU_SERVICE_URL}/menu | jq
Выход:
Вы увидите 2 пункта меню в состоянии Ready
».
7. Поздравляем!
Поздравляем, вы завершили работу над кодом!
Что мы рассмотрели:
- Как создавать задания Cloud Run
- Как выполнять задания Cloud Run
- Как создавать задания Cloud Scheduler
- Как проверить выполнение заданий
Что дальше:
Ознакомьтесь с другими лабораториями Cymbal Eats:
- Запуск облачных рабочих процессов с помощью Eventarc
- Запуск обработки событий из облачного хранилища
- Подключение к частному CloudSQL из Cloud Run
- Подключение к полностью управляемым базам данных из Cloud Run
- Безопасное бессерверное приложение с прокси-сервером с идентификацией личности (IAP)
- Безопасное развертывание в Cloud Run
- Защита входящего трафика Cloud Run
- Подключение к частному AlloyDB из GKE Autopilot
Очистить
Чтобы избежать списания средств с вашей учетной записи Google Cloud за ресурсы, используемые в этом руководстве, либо удалите проект, содержащий ресурсы, либо сохраните проект и удалите отдельные ресурсы.
Удаление проекта
Самый простой способ избавиться от выставления счетов — удалить проект, созданный вами для этого руководства.