🚀

Cloud Run Jobsを利用したマネージドCron(Scheduler)が便利

2022/08/01に公開

まだプレビュー版ではありますが、Cloud Run Jobsを利用すると、簡単にコンテナで動かせるcronジョブを設定することができて超便利なので紹介してみます。

疑問: 通常のCloud RunでもScheduler利用出来るのでは?

出来ます。ただし、HTTPエンドポイントを独自で用意してあげたり、PubSubと連携する必要があり、若干の面倒くささがあります[1]
しかし Cloud Run Jobsを利用すると Scheduler(Cron)からCloudRunアプリ直接実行することが出来る のでとても手軽にCron実行が出来るのです。


実際にどうやるか

ちなみにこの記事で書く内容は、ほぼCodeLabsの Cloud Run ジョブを使ってみる から抜粋した内容になりますので、一から試して理解したい方はこちらをご参照ください。

なお、アプリケーションの詳細や権限設定については割愛します。
あくまで Cloud Run Jobsを利用してCron設定をどうやるか だけ記載します。

Cloud Run Jobsアプリを作成する

コマンドラインからは gcloud beta run jobs コマンドを利用してCloud Run Jobsアプリケーションを作成します。コンソール画面からは Cloud Run > ジョブから新規作成でもOKです。
以下のコマンドでは screenshot というアプリ名で作成しています。
引数に関してはサンプルアプリケーションのものですので実際の説明をご確認ください。

gcloud beta run jobs create screenshot \
  --image=$REGION-docker.pkg.dev/$PROJECT_ID/containers/screenshot:v1 \
  --args="https://example.com" \
  --args="https://cloud.google.com" \
  --tasks=2 \
  --task-timeout=5m \
  --set-env-vars=BUCKET_NAME=screenshot-$PROJECT_ID \
  --service-account=screenshot-sa@$PROJECT_ID.iam.gserviceaccount.com

Schedulerを利用してCron設定を行う

あとは、以下のコマンドでschedulerジョブを作るだけです。簡単ですね!
今回の設定では、毎日9時(UTC)にscreenshotアプリを実行するスケジュールを作成しています。
ポイントとしては、タイプとして「HTTPエンドポイント」を利用するのですが、そのuriに Google APIエンドポイントを直接指定 します。
これで直接Cloud Runを実行することが出来ます。

# project番号を取得している
PROJECT_NUMBER="$(gcloud projects describe $(gcloud config get-value project) --format='value(projectNumber)')"

# schedulerの作成
gcloud scheduler jobs create http screenshot-scheduled --schedule "0 9 * * *" \
   --http-method=POST \
   --uri=https://$REGION-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/$PROJECT_ID/jobs/screenshot:run \
   --oauth-service-account-email=$PROJECT_NUMBER-compute@developer.gserviceaccount.com \
   --location $REGION

たったこれだけで、フルマネージドなCronジョブを簡単に設定することが出来ました。べんり!


脚注
  1. もし認識違っていればご指摘ください! ↩︎

Discussion