Cloud Run ジョブの環境変数を設定して、オーバーライドする方法
データアナリティクス事業本部の根本です。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を定義していた場合
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を用意します。
FROM google/cloud-sdk:latest COPY ./script.sh . RUN chmod +x ./script.sh CMD ["./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はより使いやすくなると考えます。また実行時にオーバーライドできる項目は環境変数以外にもタスク数やタイムアウト時間なども変更することができます。詳しくはリファレンスをご確認ください。この記事がどなたのお役に立てば幸いです。それではまた。