1. 概要
このラボでは、Cloud Run ジョブを作成し、Cloud Scheduler ジョブを設定します。設定スクリプトを使用して Cymbal Eats メニュー サービスをデプロイします。Cymbal Eats メニュー サービスに API 呼び出しを行う Cloud Run ジョブを作成します。Google Cloud CLI を使用してジョブを実行し、ジョブのスケジュールを設定します。ログを確認して、メニュー サービスに対して 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 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 に移動して、公開されたイメージを確認します。
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])を確認します。
コンソールでジョブの [構成] セクションを確認して、環境変数が設定されていることを確認します。
(省略可)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 ジョブをテストする
メニュー サービスのエンドポイントを使用して、既存のメニュー項目とそのステータスを確認します。
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 で [EXECUTE] ボタンをクリックします。
- Cloud Shell から次のコマンドを実行します。
gcloud beta run jobs execute cleanup-service --region=$REGION
Cloud Run の [JOBS] セクションに移動し、[LOGS] タブを開いて、メニュー項目が削除されたことを確認します。
ログを「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 から Private CloudSQL に接続する
- Cloud Run からフルマネージド データベースに接続する
- Identity-Aware Proxy(IAP)でサーバーレス アプリケーションを保護する
- Cloud Run への安全なデプロイ
- Cloud Run 上り(内向き)トラフィックの保護
- GKE Autopilot からプライベート AlloyDB に接続する
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
プロジェクトの削除
課金を停止する最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。