🕰️

Cloud Runで定期ジョブを実行する

2022/12/04に公開

本記事は GCP(Google Cloud Platform) Advent Calendar 2022 の4日目のものです。

3日目は @po3rin さんの
API on GKE に高速で認証をつけるIdentity-Aware Proxy × Identity Platform でした。

概要

普段、GCPを使ったWebアプリケーション開発をしていますが、その中で、定期的に(スケジューリングをして)、ジョブを実行するということがあります。例えば、DBのデータの整合性とか、ログの収集とか。。。

この要件のときは、GCP内で完結させるとして、Cloud SchedulerのHTTP or PubSubから、コンピューティングリソースに対してキックするパターンが、一番オーソドックスに扱われていると思っています(個人の主観+他の案件とかを見ている限り)。

ただ、このとき私としては、アプリケーション側でportを開けておく or PubSubのsubscribeをしておく。という必要があり、セキュリティ関係を考える上でIAPなどで保護するなどを考慮しないといけないため、ちょっと冗長という気もしていました。

そういう中で、今回の Cloud Run Jobs はお手軽にジョブの実行環境を作成できたので、紹介したいと思います。
ちなみに、内部ではCloud Schedulerを使っているので、今回使わないということではないです。

ジョブを作成する

基本的にはDocker Imageを作成し、GCPのArtifact Registry or Container Registryにpush後に、以下のコマンドでジョブとして作成することができます。

gcloud beta run jobs create ジョブ名 \
        --image asia-northeast1-docker.pkg.dev/プロジェクトID/適当なimage名:latest \
        --region asia-northeast1

注意点としては10分がデフォルトというところです。timeoutは最大60分(1時間)に設定できます。 task-timeout パラメータで変更することができます。
また、リトライを設定することができます。 max-retries パラメータで変更ができます。

ちなみに、更新は、基本 createupdate とするだけです。

作成したジョブを実行する

結構かんたんです。以下コマンドで実行できます。

gcloud beta run jobs execute ジョブ名

でもってAPIでも実行できます。

curl -H "Content-Type: application/json" \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -X POST -d '' \
  https://asia-northeast1-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/プロジェクトID/jobs/ジョブ名:run

実行をすると以下のような感じで実行時間と誰が実行したのかが見えます

定期実行をする

GCP詳しい人だったらすでに「あぁ、そういうこと」という認識になっているかもしれないですが、API経由で叩けるということはSchedulerを使うということです。
以下のコマンドでスケジューラが作成できます。

gcloud scheduler jobs create http スケジューラの名前 \
  --location asia-northeast1 \
  --schedule="0 0 * * *" \
  --uri="https://asia-northeast1-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/プロジェクトID/jobs/ジョブ名:run" \
  --http-method POST \
  --oauth-service-account-email CloudRunを起動できる適当なサービスアカウント

Cloud Runから以下のように見えます。

メリット

個人的には以下の点だと考えています。

  1. セキュリティとしてIAPなどの権限がいらない。HTTPなどのportを開けなくても済む。
  2. Cloud Functionsよりも、コンピューティングリソースとして潤沢に扱える
  3. Docker Imageそのまま使えるので、いろんな言語でもよい
  4. ジョブを並列化しやすい
  5. いつ実行されたかのログがわかりやすい
  6. スケジューラとまとまっている用に見えるので管理しやすい
  7. リトライ回数とか入れられる

デメリット

上記の裏返しという感じが多いのですが、一つあるとすれば、金額がFunctionsよりも高くなりがち、というのが挙げられるかと思います。

最後に

とりあえず定期実行する上では今まで通りFunctionsでもある程度はいいと思いますが、少し大きくCloud Functionsじゃ賄えないということになった場合、Cloud Runを利用して見てください!
また、 Cloud Batch も同じように色々できそうなので、今度調べてまた記事にしたいと思います。

参考の公式ドキュメントは以下になります。
https://cloud.google.com/run/docs/create-jobs?hl=ja

Discussion