Cloud Scheduler での Cloud Run ジョブのトリガー

1. 概要

このラボでは、Cloud Run ジョブを作成し、Cloud Scheduler ジョブを設定します。設定スクリプトを使用して Cymbal Eats Menu Service をデプロイします。Cymbal Eats メニュー サービスに API 呼び出しを行う Cloud Run ジョブを作成します。Google Cloud CLI を使用してジョブを実行し、ジョブのスケジュールを設定します。ログを確認し、Menu Service に API 呼び出しを実行して、メニュー項目が削除されたことを確認することで、実行を確認します。

Cloud Run ジョブとは

Cloud Run ジョブは、ウェブ リクエストを処理せずに運用タスクやデータ処理を行うコンテナを実行します。コンテナはタスクを実行し、完了すると終了します。

クリーンアップ サービス ジョブ

クリーンアップ サービス ジョブは、ステータスが「Failed」のメニュー アイテムを取得して削除します。新しいメニュー項目が作成されると、Vision API を使用して画像が分析され、それが食品かどうかが検出されます。この検証で不合格だったイメージの場合、メニュー項目のステータスは失敗に更新され、その後クリーンアップ ジョブによって削除されます。

d74200f0bd14d350.png

学習内容

このラボでは、次の方法について学びます。

  • Cloud Run ジョブを作成する
  • Cloud Run ジョブを実行する
  • Cloud Scheduler ジョブを作成する
  • ジョブの実行を確認する

前提条件

  • このラボは、Cloud コンソールとシェル環境に精通していることを前提としています。
  • Cloud Run と Cloud Scheduler の以前の経験は役立ちますが、必須ではありません。

2. 設定と要件

Cloud プロジェクトの設定

  1. Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

./setup.sh

デプロイに必要なコンポーネントがすべて作成されるのに 10 分ほどかかります。

上記のコマンドを実行したら、次の手順に進みます。

3. Cloud Run のジョブコードを確認する

Cloud Shell でプラスアイコンをクリックして新しいタブを開きます。

45f480cd1b9a995.png

クリーンアップ サービスが含まれているディレクトリに移動し、ジョブを構成するファイルを確認します。

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"]

以下に示す実際のクリーンアップ スクリプトには、失敗ステータスのメニュー項目のリストを取得し、メニューサービスへの 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 に移動して、公開されたイメージを確認します。

fb95ae38baa7c543.png

2 つ目の 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 ジョブを作成して、[FAILED_ITEM_AGE によって設定] され、1 分以上経過した失敗したメニュー項目をクリーンアップします。

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

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

724c2919d05349c8.png

(省略可)アイテムの失敗の経過時間またはメニューサービスの 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
 

[ログ] タブに切り替えて、ジョブの出力を確認します。ログに、失敗したアイテムの経過時間とメニューサービスの URL が表示されます。

518cb00036a2561f.png

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 ジョブの呼び出しに使用される uri パラメータを確認します。

  • REGIONPROJECT_ID - クリーンアップ サービス ジョブがデプロイされる Cloud Run リージョンとプロジェクト ID
  • cleanup-service - Cloud Run ジョブの名前

コンソールで Cloud Scheduler に移動して、作成されたスケジューラ ジョブを確認します。

3bc9120df7fc6ed.png

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

7945908025dd2f2b.png

6. Cloud Run ジョブをテストする

メニューサービス エンドポイントを使用して、既存のメニュー項目とそのステータスを確認します。

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)して、ジョブをトリガーします。

  1. Cloud Scheduler で [Force a job run] を選択するアクセスできます。

6c8cbeae6165ba4a.png

  1. Cloud Run ジョブから [EXECUTE] をクリックします。] ボタンを離します。

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. 完了

お疲れさまでした。これでこの Codelab は終了です。

学習した内容

  • Cloud Run ジョブを作成する方法
  • Cloud Run ジョブを実行する方法
  • Cloud Scheduler ジョブを作成する方法
  • ジョブの実行を確認する方法

次のステップ:

Cymbal Eats の他の Codelab をご確認ください。

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

プロジェクトの削除

課金を停止する最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。