Cloud Runにおける環境変数の設定について

記事タイトルとURLをコピーする

G-gen の佐々木です。当記事では Cloud Run における環境変数の設定について解説します。

Cloud Run の環境変数

仕様

Cloud Run では、Cloud Run 側の設定項目としてコンテナに環境変数を設定することができます。

Cloud Run 側に設定した環境変数は、コンテナ上で実行するアプリケーションから利用することができます。これは、Dockerfile の ENV から設定した環境変数の挙動と似ています。

環境変数は最大1000個まで設定することができ、変数の最大長として 32kb の制限があります。

環境変数のキーには「空の文字列」、「=を含む文字列」、「X_GOOGLE_から始まる文字列」は使用できません。

当記事では Cloud Run services を例として解説しますが、環境変数の設定に関する基本的な仕様は Cloud Run jobs 等、その他の実行モデルでも同様です。

暗黙的な環境変数

Cloud Run では、コンテナに対していくつかの環境変数が自動的に設定されます。

たとえば Cloud Run services では、K_REVISION 環境変数に実行中のリビジョンの名前が格納されています。また Cloud Run jobs では CLOUD_RUN_TASK_INDEX 環境変数に並列実行されるタスクのインデックスが格納されています。

その他、暗黙的に設定される環境変数のリストについては、以下のドキュメントを参照してください。

Dockerfile と重複して定義した場合

前述したように、Cloud Run で設定できる環境変数は、Dockerfile の ENV で設定した環境変数と同様の方法でアクセスできますが、もし Cloud Run 側の設定項目と Dockerfile の ENV で同じキーを持つ環境変数を設定した場合、Cloud Run 側の設定項目の値が優先されます。

Dockerfile 側ではコンテナから使用する環境変数のデフォルト値を設定し、Cloud Run 側の設定で必要に応じて上書きするといった使い方ができます。

環境変数の設定方法

コンソール

デプロイ方法を問わず、Cloud Run では作成時および更新時に環境変数を設定することができます。

コンソールの場合、コンテナの設定項目として「変数とシークレット」があるため、ここで環境変数の Key/Value を設定します。

コンソールから環境変数を設定する

gcloud CLI

--set-env-vars オプション

gcloud CLI では、gcloud run deploy コマンドや gcloud run services update コマンドなどで --set-env-vars オプションを使用することで環境変数を設定することができます。

# gcloud CLI で環境変数を設定する
$ gcloud run deploy <サービス名> --image <コンテナイメージ> \
  --set-env-vars key1=value1,key2=value2  # 複数設定する場合は,(カンマ)で区切る
  
# サービスの更新時に設定する場合
$ gcloud run services update <サービス名> \
  --set-env-vars key1=value1,key2=value2

--set-env-vars オプションは、指定した環境変数のリストで現在 Cloud Run に設定されている環境変数を上書きします。したがって、Cloud Run を更新するときに、現在設定されている環境変数に加えて新たな別の環境変数を設定したい場合、--set-env-vars オプションには「現在設定されている環境変数」と「新たに設定する環境変数」を合わせたリストを渡す必要があります。

たとえば、環境変数として既に key1=value1 が設定されている Cloud Run に対して新たに key2=value2 の環境変数を追加したい場合、--set-env-vars key2=value2 ではなく --set-env-vars key1=value1,key2=value2 と記述します。

また、環境変数を複数設定するときは key=value を ,(カンマ)区切りに記述しますが、もし , を環境変数の値として使用したい場合は、以下の例のように @ などの別の文字を区切り文字として使用することができます。

# 値に,(カンマ)を含む環境変数を設定する
$ gcloud run deploy <サービス名> --image <コンテナイメージ> \
  --set-env-vars "^@^key1=value1,value11,value111@key2=value2,value22,value222"
  
$ gcloud run deploy <サービス名> --image <コンテナイメージ> \
  --set-env-vars "^:^key1=value1,value11,value111:key2=value2,value22,value222"
  
$ gcloud run deploy <サービス名> --image <コンテナイメージ> \
  --set-env-vars "^--^key1=value1,value11,value111--key2=value2,value22,value222"

gcloud CLI でカンマを含む環境変数を設定する

--update-env-vars

環境変数は、前述の --set-env-vars オプションの他に --update-env-vars を利用して設定することもできます。

--update-env-vars オプションでは、追加・変更したい環境変数のみを指定することができるため、あとから環境変数を追加するケースではこちらを使用したほうが安全でしょう。

$ gcloud run services update dotenv \
  --update-env-vars key1=value100  # 追加・変更したい環境変数だけ指定できる

--env-vars-file オプション

Cloud Run のデプロイ時にローカルにある .env ファイルの内容を環境変数として設定することもできます。この設定方法は、2025年8月現在、Preview 公開です。

$ gcloud beta run deploy <サービス名> --image=<コンテナイメージ> \
  --env-vars-file=<.envファイルのパス>  # .env のあるパスを指定する

.env ファイルは以下のような key=value の形式で記述します。

key1=value1
key2=value2

環境変数の削除

環境変数の削除には、--remove-env-vars オプションと --clear-env-vars オプションが利用できます。

--remove-env-vars オプションでは、指定したキーの環境変数を削除します。

# 指定した環境変数のみ削除する(カンマ区切りで複数指定も可能)
$ gcloud run services update <サービス名> \
  --remove-env-vars key1

--clear-env-vars オプションでは、設定されている全ての環境変数を削除します。

# 全ての環境変数を削除する
$ gcloud run services update <サービス名> \
  --clear-env-vars

YAML ファイル

YAML ファイルを使用して Cloud Run をデプロイする場合、以下のように spec.template.spec.containersenv 属性として環境変数を設定します。

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: <サービス名>
spec:
  template:
    spec:
      containers:
      - image: <コンテナイメージ>
        env:
        - name: key1
          value: value1
        - name: key2
          value: value2

Terraform

Terraform で環境変数を設定する場合は以下のような記述となります。

# Cloud Run services の場合
resource "google_cloud_run_v2_service" "this" {
  
  project  = var.project_id
  name     = var.name
  location = var.location
  
  template {
    containers {
      image = var.image
  
      # 環境変数を設定する
      env {
        name  = "key1"
        value = "value1"
      }
      env {
        name  = "key2"
        value = "value2"
      }
    }
  }
  deletion_protection = var.deletion_protection
}

上記の場合、環境変数1つにつき template.containers.env を1つ記述する必要があるため、環境変数を多数設定する必要がある場合、Terraform の記述が冗長になってしまいます。

実際には、以下のように dynamic ブロックと for_each を併用するなどして、変数として渡された環境変数の数だけブロック動的に生成するとよいでしょう、

# Cloud Run services の場合
resource "google_cloud_run_v2_service" "this" {
  
  project  = var.project_id
  name     = var.name
  location = var.location
  
  template {
    containers {
      image = var.image
  
      # key/valueが変数として渡されている場合、渡された数だけ繰り返し設定する
      # 渡されていない場合は何も設定しない
      dynamic "env" {
        for_each = coalesce(var.env_vars, {})
        content {
          name  = env.key
          value = env.value
        }
      }
    }
  }
  deletion_protection = var.deletion_protection
}

上記のように記述した場合、variables.tf に定義する変数は以下のように記述します。

# variable.tf(抜粋)
variable "env_vars" {
  type        = map(string)
  default     = {}
}

シークレットのマウント

Cloud Run では、Secret Manager に格納した機密情報(シークレット)をマウントすることで、環境変数と同様の方法でシークレットの値にアクセスすることができます。

詳細は以下の記事を参考にしてください。

blog.g-gen.co.jp

佐々木 駿太 (記事一覧)

G-gen最北端、北海道在住のクラウドソリューション部エンジニア

2022年6月にG-genにジョイン。Google Cloud Partner Top Engineer 2025 Fellowに選出。好きなGoogle CloudプロダクトはCloud Run。

趣味はコーヒー、小説(SF、ミステリ)、カラオケなど。