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

1. 概要

このラボでは、Cloud Run ジョブを作成し、Cloud Scheduler ジョブを設定します。設定スクリプトを使用して Cymbal Eats メニュー サービスをデプロイします。Cymbal Eats メニュー サービスに API 呼び出しを行う Cloud Run ジョブを作成します。Google Cloud CLI を使用してジョブを実行し、ジョブのスケジュールを設定します。ログを確認して、メニュー サービスに対して 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

設定スクリプトを使用して、Menu サービスを Cloud Run にデプロイします。Menu サービスは、バックエンドに Cloud SQL Postgres データベースを使用して Quarkus フレームワークで構築された Java ベースのマイクロサービスです。Menu サービスは、次の手順で作成する Cloud Run ジョブのランタイム依存関係です。

./setup.sh

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

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

3. Cloud Run Job のコードを確認する

プラスアイコンをクリックして、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"]

以下の実際のクリーンアップ スクリプトには、失敗したステータスのメニューアイテムのリストを取得し、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 Job を作成する

次に、コンテナ イメージをビルドして 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")

1 分以上経過した失敗したメニュー アイテムをクリーンアップする Cloud Run ジョブを作成します(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])を確認します。

b12c8e312de3b66.png

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

724c2919d05349c8.png

(省略可)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 が表示されます。

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 Job の呼び出しに使用される 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 で、[アクション] メニューから [ジョブの強制実行] を選択します。

6c8cbeae6165ba4a.png

  1. Cloud Run Job で [EXECUTE] ボタンをクリックします。

229c22288882b5c3.png

  1. Cloud Shell から次のコマンドを実行します。
gcloud beta run jobs execute cleanup-service --region=$REGION

Cloud Run の [JOBS] セクションに移動し、[LOGS] タブを開いて、メニュー項目が削除されたことを確認します。

50829ae27b135b2d.png

ログを「deleting」キーワードでフィルタして、ログを探します。

d94fb9e444b1c1b8.png

Menu Service エンドポイントを使用して、REST エンドポイントを介して既存のメニュー項目を確認します。

curl ${MENU_SERVICE_URL}/menu | jq

出力:

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

7. 完了

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

学習した内容

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

次のステップ:

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

クリーンアップ

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

プロジェクトの削除

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