環境変数の使用

デプロイ時、Cloud Functions では、任意の Key-Value ペアを設定できます。これらのペアは、ランタイムにコードからアクセスできるリテラル環境変数、または buildpack システムの構成情報として表示されます。環境変数は Cloud Functions のバックエンドに格納され、1 つの関数にバインドされます。また、バインドされている関数と同じライフサイクルが適用されます。

ランタイム環境変数の使用

ランタイム環境変数は、関数と一緒にデプロイされる Key-Value ペアです。これらの変数のスコープは関数で、プロジェクトの他の関数からは参照できません。ランタイム環境変数を追加または削除するには、gcloud コマンドライン ツールか Cloud Console UI を使用します。

ランタイム環境変数の設定

このセクションで説明する方法を使用して、新しい変数を設定するか、既存の変数を完全に置き換えます。追加の変更を行うには、次のセクションで説明する更新プロセス(gcloud--update-env-vars フラグ)を使用します。

gcloud

gcloud コマンドライン ツールを使用してランタイム環境変数を設定するには、デプロイ時に --set-env-vars フラグを使用します。

gcloud functions deploy FUNCTION_NAME --set-env-vars FOO=bar FLAGS ...

カンマ区切りのリストを使用して、複数のランタイム環境変数を設定することもできます。

gcloud functions deploy FUNCTION_NAME --set-env-vars FOO=bar,BAZ=boo FLAGS...

ソース管理などで構成をファイルに保存する場合は、YAML ファイルと一緒に --env-vars-file フラグを使用します。

gcloud functions deploy FUNCTION_NAME --env-vars-file .env.yaml FLAGS...

.env.yaml ファイルの内容は次のとおりです。

 FOO: bar
 BAZ: boo

上の例で、FLAGS... は関数のデプロイ時に渡す他のオプションを表します。deploy コマンドの詳細については、gcloud functions deploy をご覧ください。

Cloud Console の UI

ランタイム環境変数は、関数の作成時に、Cloud Console で次のように設定できます。

  1. Cloud Console で Functions の概要ページを開きます。

    Cloud Functions の概要ページに移動

  2. [関数を作成] をクリックします。

  3. 関数の必須フィールドを入力します。

  4. [変数、ネットワーキング、詳細設定] セクションを開きます。

  5. [環境変数] タブを選択します。

  6. [ランタイム環境] セクションで、[変数を追加] をクリックして名前と値を追加します。

ランタイム環境変数の更新

既存の関数のランタイム環境変数を更新することもできます。これは、ランタイム環境変数を削除せずに変更や追加を行う、非破壊的な方法です。

gcloud

gcloud コマンドライン ツールを使用して変数を更新するには、デプロイ時に --update-env-vars フラグを使用します。

gcloud functions deploy FUNCTION_NAME --update-env-vars FOO=bar

カンマ区切りのリストを使用して、複数のランタイム環境変数を更新することもできます。

gcloud functions deploy FUNCTION_NAME --update-env-vars FOO=bar,BAZ=boo

Cloud Console の UI

Cloud Console を使用してランタイム環境変数を更新するには:

  1. Cloud Console で Functions の概要ページを開きます。

    Cloud Functions の概要ページに移動

  2. 既存の関数をクリックして、その詳細ページに移動します。

  3. [編集] をクリックします。

  4. [変数、ネットワーキング、詳細設定] セクションを開きます。

  5. [環境変数] タブを選択します。

  6. [ランタイム環境変数] セクションで必要な変更を加えます。

ランタイム環境変数の削除

gcloud

ランタイム環境変数を個別に削除する場合は、デプロイ時に --remove-env-vars フラグを使用します。

gcloud functions deploy FUNCTION_NAME --remove-env-vars FOO,BAZ

あるいは、--clear-env-vars フラグを使用して、以前に設定した環境変数をすべてクリアします。

gcloud functions deploy FUNCTION_NAME --clear-env-vars

Cloud Console の UI

Cloud Console を使用してランタイム環境変数を削除するには:

  1. Cloud Console で Functions の概要ページを開きます。

    Cloud Functions の概要ページに移動

  2. 既存の関数をクリックして、その詳細ページに移動します。

  3. [編集] をクリックします。

  4. [変数、ネットワーキング、詳細設定] セクションを開きます。

  5. [環境変数] タブを選択します。

  6. [ランタイム環境変数] セクションで、Key-Value ペアの横にあるごみ箱アイコンをクリックして削除します。

自動的に設定されるランタイム環境変数

このセクションでは、自動的に設定されるランタイム環境の一覧を示します。

Node.js 8、Python 3.7、Go 1.11

以下のランタイム環境変数は、Node.js 8、Python 3.7、Go 1.11 ランタイム用に自動的に設定されます。その他すべての Cloud Functions ランタイムは、最新のランタイムセクションで説明されているように、より限定された一連の環境変数を使用します。

キー 説明
ENTRY_POINT 予約済み: 実行される関数
GCP_PROJECT 予約済み: 現在の GCP プロジェクト ID
GCLOUD_PROJECT 予約済み: 現在の GCP プロジェクト ID(非推奨)
GOOGLE_CLOUD_PROJECT 予約済み: 未設定。ただし、内部使用のため予約済みです。
FUNCTION_TRIGGER_TYPE 予約済み: 関数のトリガー種類
FUNCTION_NAME 予約済み: 関数リソースの名前
FUNCTION_MEMORY_MB 予約済み: 関数の最大メモリ
FUNCTION_TIMEOUT_SEC 予約済み: 実行タイムアウト(秒)
FUNCTION_IDENTITY 予約済み: 関数の現在の ID(サービス アカウント)
FUNCTION_REGION 予約済み: 関数のリージョン(例: us-central1)。

最新のランタイム

最新のランタイムで自動的に設定される環境変数は、以前のランタイムよりも少なくなっています。前のセクションで説明したものを除くすべての言語とランタイムで使用される定義済み環境変数は、より制限されたものになります。

キー 説明
FUNCTION_TARGET 予約済み: 実行される関数
FUNCTION_SIGNATURE_TYPE 予約済み: 関数のタイプ。HTTP 関数の場合は http、イベント ドリブン関数の場合は event です。
K_SERVICE 予約済み: 関数リソースの名前
K_REVISION 予約済み: 関数のバージョン ID。
PORT 予約済み: 関数が呼び出されるポート。
gcloud functions deploy envVarMemory \
--runtime nodejs10 \
--set-env-vars FUNCTION_MEMORY_MB=2Gi \
--memory 2Gi \
--trigger-http
gcloud functions deploy envVarMemory \
--runtime nodejs14 \
--set-env-vars NODE_OPTIONS="--max_old_space_size=8Gi" \
--memory 8Gi \
--trigger-http

ランタイム環境変数の設定と取得の例

次のように記述して、ランタイム環境変数を設定します。

Node.js

gcloud functions deploy envVar \
--runtime nodejs14 \
--set-env-vars FOO=bar \
--trigger-http
優先する Node.js のバージョンを指定するには、--runtime フラグに次の値を使用します。
  • nodejs10
  • nodejs12
  • nodejs14

Python

gcloud functions deploy env_vars \
--runtime python39 \
--set-env-vars FOO=bar \
--trigger-http
優先する Python バージョンを指定するには、--runtime フラグに次の値を使用します。
  • python37
  • python38
  • python39

Go

gcloud functions deploy EnvVar \
--runtime go113 \
--set-env-vars FOO=bar \
--trigger-http
優先する Go バージョンを指定するには、--runtime フラグに次の値を使用します。
  • go111(サポート終了)
  • go113

Java

gcloud functions deploy java-envVar-function \
--entry-point functions.EnvVars \
--runtime java11 \
--memory 512MB \
--set-env-vars FOO=bar \
--trigger-http

C#

gcloud functions deploy csharp-envVar-function \
--entry-point EnvironmentVariables.Function \
--runtime dotnet3 \
--set-env-vars FOO=bar \
--trigger-http

Ruby

gcloud functions deploy env_vars --runtime ruby27 \
--set-env-vars FOO=bar \
--trigger-http
優先する Ruby バージョンを指定するには、--runtime フラグに次の値を使用します。
  • ruby26
  • ruby27

PHP

gcloud functions deploy envVar --runtime php74 \
--set-env-vars FOO=bar \
--trigger-http

次のように記述して、実行時にプログラムで変数にアクセスします。

Node.js

Node.js では、process.env プロパティを使用してランタイム環境変数にアクセスします。

exports.envVar = (req, res) => {
  // Sends 'bar' as response
  res.send(process.env.FOO);
};

Python

Python では、os.environ を使用してランタイム環境変数にアクセスします。

import os

def env_vars(request):
    return os.environ.get('FOO', 'Specified environment variable is not set.')

Go

Go では、os.Getenv() を使用してランタイム環境変数にアクセスします。


// Package tips contains tips for writing Cloud Functions in Go.
package tips

import (
	"fmt"
	"net/http"
	"os"
)

// EnvVar is an example of getting an environment variable in a Go function.
func EnvVar(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "FOO: %q", os.Getenv("FOO"))
}

Java

Java では、System.getenv を使用してランタイム環境変数にアクセスします。


import com.google.cloud.functions.HttpFunction;
import com.google.cloud.functions.HttpRequest;
import com.google.cloud.functions.HttpResponse;
import java.io.BufferedWriter;
import java.io.IOException;

public class EnvVars implements HttpFunction {

  // Returns the environment variable "foo" set during function deployment.
  @Override
  public void service(HttpRequest request, HttpResponse response)
      throws IOException {
    BufferedWriter writer = response.getWriter();
    String foo = System.getenv("FOO");
    if (foo == null) {
      foo = "Specified environment variable is not set.";
    }
    writer.write(foo);
  }
}

C#

ランタイムに環境変数にアクセスするには、Go で Environment.GetEnvironmentVariable を使用します。

using Google.Cloud.Functions.Framework;
using Microsoft.AspNetCore.Http;
using System;
using System.Threading.Tasks;

namespace EnvironmentVariables
{
    public class Function : IHttpFunction
    {
        public async Task HandleAsync(HttpContext context)
        {
            string foo = Environment.GetEnvironmentVariable("FOO")
                ?? "Specified environment variable is not set.";
            await context.Response.WriteAsync(foo);
        }
    }
}

Ruby

ランタイムに環境変数にアクセスするには、Ruby で ENV を使用します。

require "functions_framework"

FunctionsFramework.http "env_vars" do |_request|
  ENV["FOO"] || "Specified environment variable is not set."
end

PHP

実行時は、PHP の getenv 関数を使用して環境変数にアクセスできます。


use Psr\Http\Message\ServerRequestInterface;

function envVar(ServerRequestInterface $request): string
{
    return getenv('FOO') . PHP_EOL;
}

ビルド環境変数の使用

buildpacks をサポートするランタイム用のビルド環境変数を設定することもできます。

ビルド環境変数は、buildpacks に構成情報を渡す関数と一緒にデプロイされる Key-Value ペアです。たとえば、コンパイラ オプションをカスタマイズできます。これらのビルド環境変数を追加または削除するには、gcloud コマンドライン ツールまたは Cloud Console UI を使用します。

ビルド環境変数の設定

このセクションで説明する方法を使用して、新しい変数を設定するか、既存の変数を完全に置き換えます。追加の変更を行うには、次のセクションで説明する更新プロセス(gcloud--update-build-env-vars フラグ)を使用します。

gcloud

gcloud コマンドライン ツールを使用して変数を設定するには、デプロイ時に --set-build-env-vars フラグを使用します。

gcloud beta functions deploy FUNCTION_NAME --set-build-env-vars FOO=bar FLAGS...

カンマ区切りのリストを使用して、複数のビルド環境変数を設定することもできます。

gcloud functions deploy FUNCTION_NAME --set-build-env-vars FOO=bar,BAZ=boo FLAGS...

ソース管理などで構成をファイルに保存する場合は、YAML ファイルと一緒に --build-env-vars-file フラグを使用します。

gcloud functions deploy FUNCTION_NAME --build-env-vars-file FILE_NAME.yaml FLAGS...

*.yaml ファイルの内容は次のとおりです。

 FOO: bar
 BAZ: boo

上の例で、FLAGS... は関数のデプロイ時に渡す他のオプションを表します。deploy コマンドの詳細については、gcloud beta functions deploy をご覧ください。

Cloud Console の UI

ビルド環境変数は、関数を作成するときに Cloud Console で設定することもできます。

  1. Cloud Console で Functions の概要ページを開きます。

    Cloud Functions の概要ページに移動

  2. [関数を作成] をクリックします。

  3. 関数の必須フィールドを入力します。

  4. [変数、ネットワーキング、詳細設定] セクションを開きます。

  5. [環境変数] タブを選択します。

  6. [ビルド環境変数] セクションで、[変数を追加] をクリックして名前と値を追加します。

ビルド環境変数の更新

既存の関数のビルド環境変数を更新することもできます。これは非破壊的なアプローチです。ビルド環境変数の変更または追加は行いますが、削除は行いません。

gcloud

gcloud コマンドライン ツールを使用して変数を設定するには、デプロイ時に --update-build-env-vars フラグを使用します。

gcloud functions deploy FUNCTION_NAME --update-build-env-vars FOO=bar

カンマ区切りのリストを使用して、複数のビルド環境変数を更新することもできます。

gcloud functions deploy FUNCTION_NAME --update-build-env-vars FOO=bar,BAZ=boo

Cloud Console の UI

Cloud Console を使用してビルド環境変数を更新するには、次のようにします。

  1. Cloud Console で Functions の概要ページを開きます。

    Cloud Functions の概要ページに移動

  2. 既存の関数をクリックして、その詳細ページに移動します。

  3. [編集] をクリックします。

  4. [変数、ネットワーキング、詳細設定] セクションを開きます。

  5. [環境変数] タブを選択します。

  6. [ビルド環境変数] セクションで必要な変更を加えます。

ビルド環境変数の削除

gcloud

ビルド環境変数を個別に削除する場合は、デプロイ時に --remove-build-env-vars フラグを使用します。

gcloud functions deploy FUNCTION_NAME --remove-build-env-vars FOO,BAZ

あるいは、--clear-build-env-vars フラグを使用して、以前に設定したすべてのビルド環境変数をクリアします。

gcloud functions deploy FUNCTION_NAME --clear-build-env-vars

Cloud Console の UI

Cloud Console を使用してビルド環境変数を削除するには:

  1. Cloud Console で Functions の概要ページを開きます。

    Cloud Functions の概要ページに移動

  2. 既存の関数をクリックして、その詳細ページに移動します。

  3. [編集] をクリックします。

  4. [変数、ネットワーキング、詳細設定] セクションを開きます。

  5. [環境変数] タブを選択します。

  6. [ビルド環境変数] セクションで、Key-Value ペアの横にあるごみ箱アイコンをクリックして削除します。

変数のライフサイクル

すべての環境変数は Cloud Functions の関数のデプロイにバインドされています。デプロイを行うときにのみ、環境変数を設定または変更できます。なんらかの理由でデプロイに失敗すると、環境変数の変更は適用されません。環境変数を変更するには、デプロイに成功する必要があります。

ベスト プラクティスと予約済みの環境変数

環境変数は、関数が使用するランタイムに応じて自動的に設定されます。この設定はランタイムのオペレーティング システム(DEBIAN_FRONTENDSHLVLPATH)と言語ランタイム(NODE_ENVVIRTUAL_ENVGOPATH)で決まります。

環境によって提供される環境変数(自動的に設定される環境変数にある変数を除く)は、将来のランタイム バージョンで変更される可能性があります。明示的に設定していない環境変数に依存しないでください。また、このような変数は変更しないことをおすすめします。

環境から提供される環境変数を変更すると、予期しない結果が生じる可能性があります。こうした環境変数を変更しようとすると、ブロックされる可能性があります。最悪の場合、関数を開始できない場合もあります。競合を回避するため、環境変数の前に一意のキーを付けることをおすすめします。

また、次の環境変数は使用できません。

キー 説明
空('') キーは空の文字列にできません。
= キーに「=」文字を使用できません。
X_GOOGLE_ キーの接頭辞として X_GOOGLE_ を使用することはできません。

サイズの上限

ランタイム環境変数名と個々の関数が使用する値の合計バイト数は 32 KiB に制限されています。この合計サイズ内であれば、個々のキーまたは値に上限はありません。

ビルド環境変数の場合、定義文字列 foo=bar が 64 KiB の上限まで、最大 100 変数を定義できます。

シークレットの管理

環境変数は関数の構成に使用できますが、データベースの認証情報や API キーなどの機密情報の格納には適しません。 このような機密性の高い値は、ソースコードや外部の環境変数以外の場所に保存する必要があります。一部の実行環境やフレームワークでは、環境変数の内容がログに送信されることがあります。YAML ファイル、デプロイ スクリプト、ソース管理に重要な認証情報は保存しないでください。

シークレットを保存する場合は、シークレット管理のベスト プラクティスを確認することをおすすめします。Cloud KMS と Cloud Functions の固有の統合はありません。

ポータビリティ

現在、Cloud Functions の関数で機能する環境変数は、別のランタイム環境(別の言語や、特定のツールやライブラリなど)で動作しない可能性があります。また、別のプラットフォームで受け入れられないこともあります。

環境変数の POSIX 標準に準拠すると、このような問題を回避できます。Cloud Console で変数を編集するときに、ポータビリティに問題がある可能性がある変数を定義すると、Cloud Console から警告が表示されます(デプロイは可能です)。原則として、移植可能な文字セットで定義されているように、環境変数キーは大文字、数字、<underscore>_)のみで構成し、数字で始めないことをおすすめします。