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

1. 概要

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

Cloud Run ジョブとは

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

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

クリーンアップ サービス ジョブは、ステータスが [失敗] のメニュー項目を取得して削除します。新しいメニュー項目が作成されると、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 を生成できます。または、ご自身でお試しになることもできます。このステップを終えた後は変更できず、プロジェクト期間中は維持されます。
  • なお、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 にデプロイします。メニュー サービスは、バックエンドに Cloud SQL Postgres データベースを使用する Quarkus フレームワークで構築された Java ベースのマイクロサービスです。メニュー サービスは、次の手順で作成する 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 の [ジョブ] セクションに移動し、[ログ] タブを開いて、メニュー項目が削除されたことを確認します。

50829ae27b135b2d.png

ログで「削除」をフィルタするキーワードで検索できます。

d94fb9e444b1c1b8.png

メニュー サービス エンドポイントを使用して、REST エンドポイントを介して既存のメニュー項目をチェックします。

curl ${MENU_SERVICE_URL}/menu | jq

出力:

Ready ステータスの 2 つのメニュー項目が表示されます。

7. 完了

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

学習した内容

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

次のステップ:

Cymbal Eats の他の Codelab を確認する:

クリーンアップ

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

プロジェクトの削除

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