👌

Cloud Run ジョブにオーバーライド機能が追加されました

2023/12/18に公開

はじめに

こんにちは!クラウドエース データML ディビジョン所属の佐塚と申します。
データML ディビジョンとはクラウドエースのITエンジニアリングを担うシステム開発部の中で、特にデータ基盤構築・分析基盤構築からデータ分析までを含む一貫したデータ課題の解決を専門としております。

データML ディビジョンでは活動の一環として、毎週Google Cloud の新規リリースを調査・発表し、データ領域のプロダクトのキャッチアップをしています。その中でも重要と考えるリリースを本ページ含め記事として公開しています。

今回紹介するリリースは「Cloud Run ジョブにオーバーライド機能が追加」についてです。

オーバーライド機能とは

ジョブのオーバーライド機能は、新しいジョブの実行を開始するときに、以下のパラメータを変更することができる機能です。

  • ジョブに構成された引数
  • 環境変数
  • タスクの数
  • タスクのタイムアウト構成

ここでCloud Run ジョブとは、コンテナイメージを使用して、単一もしくは複数のタスクを構成し並列で実行する機能です。全てのタスクが完了すると成功を返します。
タスクとは、ジョブ内で行う実行の単位です。1つのタスクが1つのコンテナインスタンスを使用します。

ジョブのオーバーライド機能によって、同じジョブ定義を異なるパラメータで実行することが可能になり、パラメータの変更のたびにジョブを再デプロイする必要がなくなります。
また基盤となるジョブ定義は変更されず、変更したパラメータはそのジョブのみに反映されます。
そのため次に実行するジョブは、基盤となるパラメータを使って実行か、パラメータを再度変更して実行か選択することができます。

この機能を使用するには run.jobs.runWithOverrides の権限が必要です。
Cloud Run 管理者ロールと Cloud Run 開発者ロールにはこの権限が含まれています。

この機能を使うと、以下のようなユースケースで役立つと思います。

  • BigQueryの日付ごとに分けられたテーブルに向けてジョブを実行する際、参照するテーブルをジョブによって変更させたい場合
  • データ処理の規模に応じて、タスク数を変更させたい場合
    参考:特定の実行のジョブ構成をオーバーライドする

試してみた

基盤となるジョブのデプロイ

今回の記事では公式のCloud Run ジョブ クイックスタートに記載されているコードを参考にしてジョブオーバーライドを試してみたいと思います。
検証のゴールとしては、ジョブのオーバーライド機能を使って、パラメータが上書きできたことを確認します。

今回はパラメータの上書きが確認できればいいので、タスクはSLEEP_MS の時間sleep を実行する内容になっています。

基盤となるパラメータの値は以下の表の通りです。

基盤 オーバライド1 オーバーライド2
tasks 50 100 25
SLEEP_MS 10000 20000 5000
main.py
import json
import os
import sys
import time

# Retrieve Job-defined env vars
TASK_INDEX = os.getenv("CLOUD_RUN_TASK_INDEX", 0)
TASK_ATTEMPT = os.getenv("CLOUD_RUN_TASK_ATTEMPT", 0)
# Retrieve User-defined env vars
SLEEP_MS = os.getenv("SLEEP_MS", 0)

# Define main script
def main(sleep_ms=0):
    """Program that simulates work using the sleep method.

    Args:
        sleep_ms: number of milliseconds to sleep
    """
    print(f"Starting Task #{TASK_INDEX}, Attempt #{TASK_ATTEMPT}...")
    # Simulate work by waiting for a specific amount of time
    time.sleep(float(sleep_ms) / 1000)  # Convert to seconds

    print(f"Completed Task #{TASK_INDEX}.")

# Start script
if __name__ == "__main__":
    main(SLEEP_MS)

Procfile を作成し、以下の内容を追加します。
このファイルは、web タイプのジョブをpython で起動させるという宣言をしています。

web: python3 main.py

以下のコマンドで、コンテナをビルドして Artifact Registry にアップロードし、ジョブを Cloud Run にデプロイするソースからのデプロイを使用します。
参考:ジョブコンテナをビルドして Artifact Registry に送信し、Cloud Run にデプロイする

gcloud run jobs deploy test \
--source . \
--tasks 50 \
--set-env-vars SLEEP_MS=10000 \
--max-retries 5 \
--region  asia-northeast1 \
--project project-id

デプロイを成功すると以下の出力が得られます。

This command is equivalent to running `gcloud builds submit --pack image=[IMAGE] .` and `gcloud run jobs deploy test --image [IMAGE]`

Building using Buildpacks and deploying container to Cloud Run job [test] in project [project-id] region [asia-northeast1]
✓ Building and creating job... Done.                                                                                               
  ✓ Uploading sources...                                                                                                           
  ✓ Building Container... Logs are available at [https://console.cloud.google.com/cloud-build/builds/52adbf7f-0efa-403b-a829-7431c3
  87139a?project=xxxxxxxx].                                                                                                    
Done.                                                                                                                              
Job [test] has successfully been deployed.

To execute this job, use:
gcloud run jobs execute test

ジョブの実行

先ほどデプロイしたジョブを以下のコマンドで実行します。

gcloud run jobs execute test --region asia-northeast1

ジョブを開始すると以下の出力が得られます。

✓ Creating execution... Done.                                                                                                      
✓ Provisioning resources...                                                                                                      
Done.                                                                                                                              
Execution [test-gxrpc] has successfully started running.

View details about this execution by running:
gcloud run jobs executions describe test-gxrpc

Or visit https://console.cloud.google.com/run/jobs/executions/details/asia-northeast1/test-gxrpc/tasks?project=xxxxxxxx

ジョブの結果を取得したい場合、以下のコマンドを入力します。

gcloud run jobs executions describe test-gxrpc

ジョブの結果として以下の出力が得られます。

✔ Execution test-gxrpc in region asia-northeast1
50 tasks completed successfully
Elapsed time: 30 seconds

Log URI: https://console.cloud.google.com/logs/viewer?project=project-id&advancedFilter=resource.type%3D%22cloud_run_job%22%0Aresource.labels.job_name%3D%22test%22%0Aresource.labels.location%3D%22asia-northeast1%22%0Alabels.%22run.googleapis.com/execution_name%22%3D%22test-gxrpc%22

Image:           asia-northeast1-docker.pkg.dev//cloud-run-source-deploy/test@sha256:d10f8f76af1cb14bc6e8d4ce942eb8e92f8947213081fd7638404d026f54aeee
Tasks:           50
Memory:          512Mi
CPU:             1000m
Task Timeout:    600s
Max Retries:     5
Parallelism:     50
Service account: xxxxxxx-compute@developer.gserviceaccount.com
Env vars:
SLEEP_MS       10000

2行目に50 tasks completed successfully と出力され 50個のタスクが成功しジョブが成功したことが確認できます。
また7~16行目では、Image や Tasks のようにジョブの実行で使用した基盤となるパラメータが確認できます。

コマンドラインでのオーバーライド

基盤となるジョブは設定したので、次にオーバーライドを試してみたいと思います。
ジョブを実行するコマンドの引数に、先ほどの表にあるオーバーライド1の値task = 100, SLEEP_MS = 20000 を設定します。

gcloud run jobs execute test \
--region asia-northeast1 \
--update-env-vars SLEEP_MS=20000 \
--tasks 100 \

--出力--
✓ Creating execution... Done.                                                                                                      
✓ Provisioning resources...                                                                                                      
Done.                                                                                                                              
Execution [test-7prs4] has successfully started running.

View details about this execution by running:
gcloud run jobs executions describe test-7prs4

Or visit https://console.cloud.google.com/run/jobs/executions/details/asia-northeast1/test-7prs4/tasks?project=xxxxxxxx

以下のコマンドで結果を出力させます。

gcloud run jobs executions describe test-7prs4

--出力--
✔ Execution test-7prs4 in region asia-northeast1
100 tasks completed successfully
Elapsed time: 2 minutes and 6 seconds

Log URI: https://console.cloud.google.com/logs/viewer?project=project-id&advancedFilter=resource.type%3D%22cloud_run_job%22%0Aresource.labels.job_name%3D%22test%22%0Aresource.labels.location%3D%22asia-northeast1%22%0Alabels.%22run.googleapis.com/execution_name%22%3D%22test-7prs4%22

Image:           asia-northeast1-docker.pkg.dev/project-id/cloud-run-source-deploy/test@sha256:d10f8f76af1cb14bc6e8d4ce942eb8e92f8947213081fd7638404d026f54aeee
Tasks:           100
Memory:          512Mi
CPU:             1000m
Task Timeout:    10m
Max Retries:     5
Parallelism:     100
Service account: xxxxxxxx-compute@developer.gserviceaccount.com
Env vars:
SLEEP_MS       20000

Tasks,SLEEP_MS の行で、オーバーライドで設定した値task = 100, SLEEP_MS = 20000 が確認できます。

コンソールでのオーバーライド

オーバーライドはコンソールからでも設定することが可能です。
Cloud Run ジョブのコンソール上から[実行]の右を選択し、オーバーライドを使用して実行を選択します。

console1

パラメータを入力するページが表示されるので、先ほどの表にあるオーバーライド2の値task = 25, SLEEP_MS = 5000 に設定し実行ボタンを選択します。

console2

では結果を確認します。
ジョブの実行結果はコンソール上でも確認ができます。

console3

Tasks,SLEEP_MS の行で、オーバーライドで設定した値task = 25, SLEEP_MS = 5000 が確認できます。

まとめ

今回は Cloud Run ジョブのオーバーライド機能についてまとめました。
最後まで読んでいただきありがとうございます。

Discussion