1. 概要
このラボでは、Cloud Run ジョブを作成し、Cloud Scheduler ジョブを設定します。設定スクリプトを使用して Cymbal Eats Menu Service をデプロイします。Cymbal Eats Menu Service に API 呼び出しを行う Cloud Run ジョブを作成します。Google Cloud CLI を使用してジョブを実行し、ジョブのスケジュールを設定します。ログを確認し、Menu Service に API 呼び出しを行ってメニュー項目が削除されたことを確認することで、実行を検証します。
Cloud Run ジョブとは
Cloud Run ジョブは、ウェブ リクエストを処理するのではなく、運用タスクやデータ処理を実行するコンテナを実行します。コンテナはタスクを実行し、完了すると終了します。
クリーンアップ サービス ジョブ
クリーンアップ サービスジョブは、ステータスが Failed のメニュー項目を取得して削除します。新しいメニュー アイテムが作成されると、Vision API を使用して画像が分析され、食品かどうかを検出します。この検証に失敗したイメージの場合、メニュー項目のステータスは [失敗] に更新され、その後、クリーンアップ ジョブによって削除されます。

学習内容
このラボでは、次の方法について学びます。
- Cloud Run ジョブを作成する
- Cloud Run ジョブを実行する
- Cloud Scheduler ジョブを作成する
- ジョブの実行を確認する
前提条件
- このラボは、Cloud コンソールとシェル環境に精通していることを前提としています。
- Cloud Run と Cloud Scheduler の使用経験があると役立ちますが、必須ではありません。
2. 設定と要件
Cloud プロジェクトのセットアップ
- Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。



- プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列です。この設定はいつでも変更できます。
- プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud コンソールでは一意の文字列が自動生成されます。通常は、この内容を意識する必要はありません。ほとんどの Codelab では、プロジェクト ID(通常は
PROJECT_IDと識別されます)を参照する必要があります。生成された ID が好みではない場合は、ランダムに別の ID を生成できます。または、ご自身で試して、利用可能かどうかを確認することもできます。このステップ以降は変更できず、プロジェクトを通して同じ ID になります。 - なお、3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
- 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に請求が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクト全体を削除します。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 サービスは、バックエンドに Cloud SQL Postgres データベースを使用する Quarkus フレームワークで構築された Java ベースのマイクロサービスです。Menu サービスは、次の手順で作成する Cloud Run ジョブのランタイム依存関係です。
./setup.sh
デプロイでは、必要なすべてのコンポーネントの作成に約 10 分かかります。
上記のコマンドを実行したら、次の手順に進みます。
3. Cloud Run Job のコードを確認する
プラスアイコンをクリックして、Cloud Shell で新しいタブを開きます。

クリーンアップ サービスを含むディレクトリに移動し、ジョブを構成するファイルを確認します。
cd ~/cymbal-eats/cleanup-service
このディレクトリの cleanup-service には、必要な依存関係(httpie、jq)を含むクリーンアップ サービス ジョブのコンテナ イメージを定義する Dockerfile が含まれています。
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"]
実際のクリーンアップ スクリプト(下記)には、失敗ステータスのメニュー項目のリストを取得し、Menu サービスに API 呼び出しを行ってそれらを削除するコマンドが含まれています。
script.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- Cymbal Eats メニュー サービスの URL。
4. Cloud Run ジョブを作成する
次に、コンテナ イメージをビルドして Artifact Registry に公開します。
このコンテナ イメージは、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 イメージを保存する新しい Artifact Registry リポジトリを作成します。
gcloud artifacts repositories create cymbal-eats --repository-format=docker --location=$REGION
Cloud Build を使用してコンテナ イメージをビルドし、1 つのコマンドで Artifact Registry に push します。
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
公開が完了したら、Artifact Registry に移動して、公開されたイメージを確認します。

2 つ目の 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")
1 分より古い [FAILED_ITEM_AGE で設定] 失敗したメニュー項目をクリーンアップする Cloud Run ジョブを作成します。
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] の各タブを確認します。

コンソールのジョブの [構成] セクションを確認して、環境変数が設定されていることを確認します。

(省略可)Failed Item Age 変数または Menu Service URL 変数を変更する場合は、Cloud Run ジョブの作成後に update コマンドを使用します。
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
[ログタブ] に切り替えて、ジョブの出力を確認します。ログに Failed Item Age と Menu Service URL が表示されます。

5. Cloud Run ジョブのスケジュールを設定する
Cloud Scheduler は、エンタープライズ クラスのフルマネージド cron ジョブ スケジューラです。バッチ処理、ビッグデータ ジョブ、クラウド インフラストラクチャ オペレーションなど、実質的にほぼすべてのジョブをスケジューリングできます。
Cloud Scheduler ジョブを使用する際のセキュリティのベスト プラクティスの 1 つは、個別の認証情報を使用して各ジョブを実行することです。このステップでは、クリーンアップ スケジューラ ジョブで使用するサービス アカウントを作成します。
export SCHEDULER_SERVICE_ACCOUNT=cleanup-scheduler-job-sa
gcloud iam service-accounts create ${SCHEDULER_SERVICE_ACCOUNT}
Cloud Scheduler ジョブには、Cloud Run ジョブを呼び出す権限が必要です。
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
- Pub/Sub
- 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
Cloud Run Job の呼び出しに使用される uri パラメータを確認します。
REGIONとPROJECT_ID- クリーンアップ サービス ジョブがデプロイされる Cloud Run リージョンとプロジェクト IDcleanup-service- Cloud Run ジョブの名前
コンソールの Cloud Scheduler に移動して、作成したスケジューラ ジョブを確認します。

[アクション] メニューで利用可能なオプションを確認します。

6. Cloud Run ジョブをテストする
Menu Service エンドポイントを使用して、既存のメニュー アイテムとそのステータスを確認します。
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 分間待ちます。メニュー項目を削除するには、FAILED_ITEM_AGE パラメータで設定されているように、1 分経過している必要があります。
次のスケジュールされた実行を待つか、コンソールからジョブの実行を強制できます。
ジョブをトリガーする方法は複数あります。UI またはコマンドラインからトリガーできます。
この例では、Cloud Shell(オプション 3)でコマンドを実行してジョブをトリガーします。
- Cloud Scheduler の [アクション] メニューから [ジョブの実行を強制する] を選択します。

- [Cloud Run Job] で [実行] ボタンをクリックします。

- Cloud Shell から次のコマンドを実行します。
gcloud beta run jobs execute cleanup-service --region=$REGION
Cloud Run の [ジョブ] セクションに移動し、[ログ] タブを開いて、メニュー項目が削除されたことを確認します。

「deleting」というキーワードでログをフィルタして、ログを見つけます。

Menu Service エンドポイントを使用して、REST エンドポイントから既存のメニュー項目を確認します。
curl ${MENU_SERVICE_URL}/menu | jq
出力:
Ready ステータスのメニュー項目が 2 つ表示されます。
7. 完了
お疲れさまでした。これでこの Codelab は終了です。
学習した内容
- Cloud Run ジョブを作成する方法
- Cloud Run ジョブを実行する方法
- Cloud Scheduler ジョブを作成する方法
- ジョブの実行を確認する方法
次のステップ:
Cymbal Eats の他の Codelab をご覧ください。
- Eventarc を使用して Cloud Workflows をトリガーする
- Cloud Storage からイベント処理をトリガーする
- Cloud Run からプライベート CloudSQL に接続する
- Cloud Run からフルマネージド データベースに接続する
- Identity Aware Proxy(IAP)でサーバーレス アプリケーションを保護する
- Cloud Run への安全なデプロイ
- Cloud Run 上り(内向き)トラフィックの保護
- GKE Autopilot からプライベート AlloyDB に接続する
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
プロジェクトの削除
課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。