Cloud Run ジョブの環境変数を設定して、オーバーライドする方法

2024.05.31

データアナリティクス事業本部の根本です。Cloud Run ジョブ、良いサービスですよね。私は大好きです。そんな大好きなCloud Run ジョブですがコンテナデプロイ時に環境変数を設定することも、実行時にオーバーライドすることもできてしまいます。
この記事を読むと、Cloud Run ジョブの環境変数の設定方法がわかりCloud Run ジョブの活用度合いが増すこと間違いなし!です。ぜひ読んでみてください。

この記事に書いてあること

  • Cloud Run jobsの環境変数設定方法
  • 設定した環境変数をジョブ実行時にオーバーライドする方法

※Cloud Run ジョブとはそもそもなんぞや、という方はこちらの記事もご参照ください。

環境変数を設定してみる

ジョブのデプロイ時に設定する方法

gcloudコマンドでデプロイする場合に設定する時は以下のフラグを使用します。
--set-env-vars
実際の使用例は以下となります。

gcloud run jobs deploy hello-cloud-run \
--source . \
--tasks=1 \
--cpu=1 \
--max-retries=0 \
--memory=512Mi \
--parallelism=1 \
--task-timeout=600 \
--set-env-vars "ENV_VAR=DEPLOY_VALUE" \
--region asia-northeast1

上記コマンドでは--set-env-varsにて変数名:ENV_VARを定義して値にDEPLOY_VALUEを設定しています。

変数名
ENV_VAR DEPLOY_VALUE

設定した環境変数の確認方法

以下のコマンドで確認することができます。

gcloud run jobs describe "ジョブ名" \
--region=asia-northeast1

先ほどデプロイしたジョブを指定して実行すると以下の出力となります。

✔ Job hello-cloud-run in region asia-northeast1
Executed 9 times
Last executed 2024-05-31T06:33:25.784606Z with execution hello-cloud-run-z64vg
Last updated on 2024-05-31T06:33:25.806598Z by ---省略---
 
Image:           asia-northeast1-docker.pkg.dev/---省略----
Tasks:           1
Memory:          512Mi
CPU:             1
Task Timeout:    10m
Max Retries:     0
Parallelism:     1
Service account: ---省略---
Env vars:
  ENV_VAR        DEPLOY_VALUE

Env vars:の項目に設定した環境変数ENV_VARが出力されていることが確認できました。

ジョブのデプロイ時に設定した環境変数名をDockerファイルでも定義していた場合

ジョブのデプロイ時設定する環境変数名と同じ変数名をDockerファイル内に定義していた場合、ジョブ実行時に設定される値はDockerファイルに設定した値となります。
例えば以下のDockerfileを定義していた場合

Dockerfile

FROM google/cloud-sdk:latest
ENV ENV_VAR="DOCKERFILE_VALUE"

デプロイ時に--set-env-vars "ENV_VAR=DEPLOY_VALUE"でジョブをデプロイしていても、
ジョブを実行すると実行時の変数に設定される値はDOCKERFILE_VALUEとなります。整理すると以下となります。

ジョブ実行前(デプロイしただけの状態) ジョブ実行中
ENV_VARの値 DEPLOY_VALUE DOCKERFILE_VALUE

環境変数をジョブ実行時に上書き(オーバーライド)する

準備

まずは環境変数を確認できるシェルスクリプトとDockerfileを用意します。

Dockerfile

FROM google/cloud-sdk:latest
COPY ./script.sh .
RUN chmod +x ./script.sh
CMD ["./script.sh"]

指定したシェルスクリプトを実行する実装です。実行するシェルスクリプトは以下です。

script.sh

#!/bin/bash
echo "----環境変数開始----"
echo $ENV_VAR
echo "----環境変数終了----"

上記のスクリプトとDockerファイルを同じフォルダに配置した状態でそのフォルダにてデプロイコマンドを実行します。

gcloud run jobs deploy hello-cloud-run \
--source . \
--tasks=1 \
--cpu=1 \
--max-retries=0 \
--memory=512Mi \
--parallelism=1 \
--task-timeout=600 \
--set-env-vars "ENV_VAR=DEPLOY_VALUE"  \
--region asia-northeast1

デプロイができたら環境変数が設定されているか以下のコマンドで確認します。

gcloud run jobs describe hello-cloud-run \
--region=asia-northeast1

以下の出力がされていれば準備は完了です(ジョブを実行してログから見ていただいても構いません)。

Env vars:
  ENV_VAR        DEPLOY_VALUE

環境変数をオーバーライドしてジョブを実行する

実行時に環境変数をオーバーライドする場合は--update-env-varsを用います。
以下がオーバーライドして実行するコマンドの例です。

gcloud run jobs execute hello-cloud-run \ 
--region=asia-northeast1 \
--update-env-vars ENV_VAR=OVERRIDE_VALUE

--update-env-vars ENV_VAR=OVERRIDE_VALUEにて環境変数のオーバーライドを行っています。
実行したジョブのログを確認してみます。 . デプロイ時に設定したENV_VARの値DEPLOY_VALUEが、ジョブ実行時にはOVERRIDE_VALUEという実行時に指定した値に変わっていることが確認できました。

補足:Dockerファイルとデプロイコマンドで同じ環境変数名にしていてそれをオーバーライドした場合

以下のDockerfile(変数ENV_VAR)を作成して、

FROM google/cloud-sdk:latest
ENV ENV_VAR=DOCKERFILE_VAR

デプロイコマンドで同じ環境変数名を指定してデプロイして、オーバーライドした場合は
オーバーライドした値で実行されました。

環境変数をオーバーライドできることで何が嬉しいのか?

環境変数を元に処理を実行するシェルスクリプトを実装すれば、Workflowsなど呼び出しもとで環境変数値を指定して並列で呼び出したりして汎用性・並列性を持った処理に活用することができます。例えば以下のようなCloud Storageから指定ファイルを圧縮して再度アップロードするスクリプト。

BUCKET_NAME="your-bucket-name"
FILE_NAME=$ENV_FILE_NAME
LOCAL_FILE_PATH="/tmp/$FILE_NAME"
COMPRESSED_FILE_PATH="/tmp/$FILE_NAME.gz"
# GCSからファイルをダウンロード
gsutil cp gs://$BUCKET_NAME/$FILE_NAME $LOCAL_FILE_PATH
# ファイルをgzipで圧縮
gzip -c $LOCAL_FILE_PATH > $COMPRESSED_FILE_PATH
# 圧縮ファイルをGCSにアップロード
gsutil cp $COMPRESSED_FILE_PATH gs://$BUCKET_NAME/$FILE_NAME.gz

上記のスクリプトを実行時にファイル名の環境変数をオーバーライドして呼び出すと各ファイルをそれぞれ別のタスクとして実行することができます。このような用途に用いることもできます。

おわりに

環境変数を用いることでCloud Run jobsはより使いやすくなると考えます。また実行時にオーバーライドできる項目は環境変数以外にもタスク数タイムアウト時間なども変更することができます。詳しくはリファレンスをご確認ください。この記事がどなたのお役に立てば幸いです。それではまた。