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

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 を使用して画像が分析され、食品かどうかを検出します。この検証に失敗したイメージの場合、メニュー項目のステータスは [失敗] に更新され、その後、クリーンアップ ジョブによって削除されます。

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 ジョブを作成する

次に、コンテナ イメージをビルドして 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 タブに戻ります。次のコマンドを実行して、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] の各タブを確認します。

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 ジョブをテストする

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)でコマンドを実行してジョブをトリガーします。

  1. Cloud Scheduler の [アクション] メニューから [ジョブの実行を強制する] を選択します。

6c8cbeae6165ba4a.png

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

229c22288882b5c3.png

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

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

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 アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

プロジェクトの削除

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