G-gen の佐々木です。当記事では Google Cloud (旧称 GCP) のサーバーレスなコンテナサービスである Cloud Run の機能の 1 つ、Cloud Run jobs について解説します。
Cloud Run jobs とは
Cloud Run jobs とは Google Cloud におけるサーバーレス コンテナコンピューティングサービスである Cloud Run の 1 機能です。
Cloud Run には Cloud Run services と Cloud Run jobs があります。HTTPS リクエストをトリガーとして実行される Cloud Run services とは異なり、Cloud Run jobs は手動やスケジュール、ワークフローの一部など、任意のタイミングで実行されることを前提としているのが特徴です。
Cloud Run の詳細については以下の記事で解説しています。
Cloud Run jobs のリソースモデル
Cloud Run Jobs は Job、Task、Execution という 3 つのリソースで構成されています。
Job
Cloud Run jobs にコンテナをデプロイすると、ルートリソースである Job が作成されます。
Job にはデプロイ時に指定したコンテナイメージ、Task 数、並列実行数、CPU、メモリ量、環境変数などの設定が保持されます。
ジョブの実行がトリガーされると Execution が作成され、Job に設定した内容に応じて Task が作成されます。
Task
Job で指定された数だけ作成され、Task 1 つにつき 1 つのコンテナインスタンスが起動して処理を行います(1 Task = 1 コンテナインスタンス)。
Job の設定内容に応じて、複数の Task を並行して実行することができます。
また、Cloud Run jobs のコンテナインスタンスは Cloud Run 第 2 世代の実行環境 を使用します。
Execution
1回の Job 実行を指します。
Execution は全ての Task が完了した場合に成功とされます。
Task がタイムアウトした場合は Job で指定した数だけ再試行され、いずれかの Task の再試行が指定された回数を超過した場合、その Task は失敗とされ、Execution 全体が失敗となります。
Cloud Run jobs の特徴
Cloud Run services との違いに着目した場合、Cloud Run jobs の主な特徴は 3 つあります。
任意のタイミングでの実行
Cloud Run services ではサービスを作成すると HTTPS エンドポイントが生成され、HTTP リクエストをトリガーとしてコンテナが実行されます。
それに対して Cloud Run jobs では、HTTPS エンドポイントを使用せず、以下の 3 種類の方法を用いることで、ユーザーの任意のタイミングでコンテナを実行することができます。
実行方法 | 説明 |
---|---|
手動実行 | コンソールや gcloud コマンド、Google Cloud APIs 経由でジョブを実行します。 gcloud コマンドを使用する場合 --execute-now オプションを指定することで、ジョブの作成後すぐに実行することが可能です。 |
Cloud Scheduler トリガー | Cloud Scheduler で cron ジョブを設定し、スケジュールに従ってジョブを実行することができます。 |
Workflows トリガー | サーバーレスのジョブ自動化サービスである Cloud Workflows で Cloud Run Admin API コネクタ を使用することで、ワークフローからジョブを実行することができます。 |
Cloud Scheduler、Cloud Workflows の詳細については当ブログに解説記事があるので、こちらもご一読ください。
長時間の実行
Task あたりの最大実行時間は 24 時間であり、また Job あたりの最大実行時間に制限がないため、複数のタスクを直列で実行することで、長時間の処理を実現することができます。
並列処理
リクエストの負荷に応じてコンテナインスタンスをスケーリングする Cloud Run services とは異なり、Cloud Run jobs では並列して実行するコンテナインスタンス(=Task)の数を明示的に指定することができます。
並列実行される各 Task には整数値のインデックスが割り当てられ、環境変数 CLOUD_RUN_TASK_INDEX
を参照することで、その値を使用することができます。
インデックスを利用することで、Task ごとにデータベースや CSV ファイル内の異なるデータを参照するような処理を実装することが可能です。
また、環境変数 CLOUD_RUN_TASK_ATTEMPT
にはタスクの再試行回数が格納され、再試行されるたびに値が 1 増加します。
再試行回数に応じた処理を実装する場合にこの値を利用することができます。
制限事項
Cloud Run jobs を使用する際に意識する必要がある制限事項を記載します。
コンピューティングリソース
Task が実行するコンテナインスタンスに対して割り当てることができる CPU 数・メモリ量を記載します。
Cloud Run services 同様、一方の値によって、もう一方で設定できる値の範囲に制限があります。
たとえば、CPU 数が 4 の場合、メモリ量は 2 GiB ~ 16 GiB の範囲で設定する必要があります。
項目 | 設定値 |
---|---|
CPU 数 | 1・2・4・6・8 |
メモリ量 | 512 Mib・1 GiB・2 GiB・4 GiB・8 GiB・15 GiB・32 GiB (カスタム設定として 512 Gib ~ 34 GiB の範囲で設定することも可能) |
Task の実行数と並列実行数
Task は最大 10,000 個まで実行することができ、それを並列で実行できる数は Job を作成したリージョンと、コンテナインスタンスに割り当てた CPU 数・メモリ量に依存します。
リソースを多く持つリージョンではより多くの Task を並列実行することができ、また CPU とメモリを多く割り当てる場合は Task の最大並列実行数が減少します。
デフォルトの設定では、可能な限り多くのタスクを並列実行するようになっています。
Cloud Run におけるコンテナインスタンスの最大実行数はプロジェクト・リージョンごとに上限値が設定されており、Task で実行されるコンテナインスタンスと Cloud Run services で実行されるコンテナインスタンスは上限値を共有しているため、同じプロジェクト・リージョンで利用する場合は注意が必要です。
Task のタイムアウト
デフォルトの設定では、Task ごとに最大 10 分間実行され、10 分を超過した場合にタイムアウトとなり、Task が再試行されます。
タイムアウトの時間は秒単位で調整することができ、最長で 86400 秒(24 時間)に変更することが可能です(※2024年11月現在、プレビュー機能として24~168時間に設定も可能)。
ジョブの実行中は、メンテナンスイベントにより、タスクを実行しているインスタンスが別のインスタンスに移行する可能性があります。
メンテナンスは透過的に行われ、インスタンスの移行によってタスクの状態が失われることはありませんが、移行中は処理が短時間停止します。
Task の最大再試行回数
Task の実行がタイムアウトになると、指定された回数だけ再試行されます。
最大再試行回数のデフォルトは 3 回であり、0 ~ 10 の範囲で設定することが可能です。
最大再試行回数を超過した Task があった場合、Job の実行は失敗となります。
VPC リソースとの接続
Cloud Run services 同様、Cloud SQL や Memorystore といった VPC に紐づくリソースに対してプライベート IP で接続したい場合、サーバーレス VPC アクセス もしくは Direct VPC Egress を使用します。
サーバーレス VPC アクセス と Direct VPC Egress については以下の記事で解説しています。
料金
Cloud Run jobs の料金設定は、CPU を常に割り当てる Cloud Run service と共通になっています(参考:東京リージョンの場合の料金)。
CPU を常に割り当てる Cloud Run service と異なり、処理を行っているときだけ料金が発生し、また無料枠や確約利用割引が適用されるため、処理の内容によってはかなり安価で利用することができます。
Batch との違い
Google Cloud でバッチ処理を行う場合のその他の選択肢として Batch があります。
Batch では、マネージドな Compute Engine 仮想マシンを使用して、大規模なバッチワークロードを実行できるプロダクトです。
バッチジョブ作成時に記述したスクリプトをそのまま実行できるほか、Cloud Run jobs 同様、コンテナイメージを仮想マシンにデプロイして処理を行うこともできます。
以下の記事に Batch の概要、および Cloud Run jobs や Cloud Functions との比較について記載があります。
Cloud Run jobs を使用するケース
- ジョブの実行時間が 24 時間以内
- 負荷の軽いジョブを安価に実行する
Cloud Run jobs では Task を直列に組み合わせることで 1 時間以上の処理を実現することができますが、基本的には 1 時間以内のジョブを並列実行したい場合に利用します。
Batch と比較すると使用できるコンピュートリソースの上限は低くなっていますが、月ごとの無料枠を上手く利用することで、負荷の軽いジョブであればかなり安価に実行することができます。
Batch を使用するケース
- ジョブの実行時間が 24 時間以上
- CPU、メモリを多く使用する、または GPU を使用するジョブを実行する
- オンプレミスや Compute Engine 仮想マシン上で実行していたバッチスクリプトを移行する
Batch ではジョブの実行時間に制限がないため、1 時間を超える長時間のバッチ処理で利用します。
Compute Engine 仮想マシン上でジョブが実行されるため、Cloud Run jobs と比較して、より多くのコンピュートリソースや、Cloud Run で使用できない GPU を割り当てることができます。
また、Cloud Run jobs ではジョブをコンテナ化する必要があるのに対して、Batch ではスクリプトをそのまま使用できるため、少ない手間でバッチスクリプトをサーバーレスの実行基盤に移行することができます。
佐々木 駿太 (記事一覧)
G-gen最北端、北海道在住のクラウドソリューション部エンジニア
2022年6月にG-genにジョイン。Google Cloud Partner Top Engineer 2025 Fellowに選出。好きなGoogle CloudプロダクトはCloud Run。
趣味はコーヒー、小説(SF、ミステリ)、カラオケなど。
Follow @sasashun0805