シークレットを構成する
Secret Manager を使用すると、API キー、パスワード、その他の機密情報を安全に保存できます。このガイドでは、Secret Manager に保存されているシークレットにアクセスするように Cloud Functions を構成する方法について説明します。
このドキュメントでは、関数でシークレットを利用できるようにする次の方法について説明します。
シークレットをボリュームとしてマウントする。これにより、関数でシークレットをファイルとして使用できるようになります。シークレットをボリュームとして参照すると、ディスクからファイルを読み取るたびに、関数が Secret Manager にアクセスし、シークレット値を取得します。このため、常に同じバージョンではなく、最新バージョンのシークレットを参照する場合は、ボリュームとしてマウントすることをおすすめします。この方法は、シークレットのローテーションを実装する場合にも役立ちます。
シークレットを環境変数として渡す。環境変数の値はインスタンスの起動時に解決されるため、この方法を使用する場合は、最新バージョンのシークレットを参照するのではなく、常に同じバージョンのシークレットを参照することをおすすめします。
Secret Manager の使用方法については、Secret Manager の概要をご覧ください。シークレットを作成してアクセスする方法については、シークレットの作成をご覧ください。
始める前に
-
Enable the Secret Manager API.
- Secret Manager でシークレットをまだ作成していない場合は、シークレットの作成の説明に沿って作成します。
シークレットへのアクセスを許可する
関数から同じプロジェクトにあるシークレットにアクセスすることも、別のプロジェクトにあるシークレットにアクセスすることもできます。シークレットにアクセスするには、関数のランタイム サービス アカウントにシークレットのアクセス権を付与する必要があります。
デフォルトでは、Cloud Functions は App Engine のデフォルト サービス アカウントを使用して Secret Manager で認証を行います。本番環境で使用する場合は、関数のタスクの実行に必要な最小限のロールセットが割り当てられたユーザー管理のサービス アカウントで認証を行うように関数を構成することをおすすめします。
Cloud Functions で Secret Manager を使用するには、関数に関連付けられているサービス アカウントに roles/secretmanager.secretAccessor
ロールを割り当てます。
Google Cloud コンソールの [Secret Manager] ページに移動します。
[Secret Manager] ページに移動シークレットの横にあるチェックボックスをオンにします。
まだ開いていない場合は、[情報パネルを表示] をクリックしてパネルを開きます。
情報パネルで [プリンシパルを追加] をクリックします。
[新しいプリンシパル] フィールドに、関数が ID に使用するサービス アカウントを入力します。関数のサービス アカウントは次のいずれかです。
デプロイ時に関数に割り当てられたユーザー管理のサービス アカウント。ユーザー管理のサービス アカウントで関数をデプロイする方法については、関数に個々のサービス アカウントを使用するをご覧ください。
App Engine のデフォルト サービス アカウント(本番環境での使用は推奨されません)。
[ロールを選択] プルダウンで、[Secret Manager]、[Secret Manager のシークレット アクセサー] の順に選択します。
シークレットにアクセスできるように関数を準備する
関数でシークレットを使用できるようにするには、次の 2 つの方法があります。
- シークレットを環境変数として渡す。
- シークレットをボリュームとしてマウントする。
環境変数
環境変数を使用して、関数でシークレットを利用できるようにするには:
- 関数のデプロイ時にランタイム環境変数を設定します。
- 環境変数内で、シークレットを関数からアクセスできるようにします。
- 実行時にプログラムによって環境変数にアクセスします。
シークレットをボリュームとしてマウントする
シークレットをボリュームとしてマウントするには:
シークレットを含むファイルを作成します。
シークレットのマウントパスとして、システム以外の未使用のディレクトリ(
/mnt/secrets
など)を選択します。そのディレクトリにある既存のファイルまたはサブディレクトリ(シークレットとそのバージョン以外)は、シークレットがマウントされるとアクセスできなくなります。シークレットをマウントされたボリュームとして関数からアクセスできるようにします。
実行時にファイルの内容をプログラムで読み取り、シークレットの値にアクセスします。
たとえば、シークレットが /mnt/secrets/secret1
にマウントされている場合、関数はこのファイルを読み取る必要があります。Node.js を使用してファイルを同期的に読み取る方法の例を次に示します。
fs.readFileSync('/mnt/secrets/secret1')
関数がシークレットにアクセスできるようにする
関数からシークレットを参照するには、まず、シークレットが関数にアクセスできるようにする必要があります。Google Cloud Console または Google Cloud CLI を使用して、シークレットが新しい関数または既存の関数にアクセスするようにできます。
コンソール
シークレットが関数にアクセスできるようにするには:
Google Cloud コンソールの [Cloud Functions] ページに移動します。
[Cloud Functions] ページに移動シークレットへのアクセスを許可する関数の名前をクリックします。
[編集] をクリックします。
[ランタイム、ビルド...] をクリックして、詳細な構成オプションを開きます。
[セキュリティとイメージのリポジトリ] をクリックしてタブを開きます。
[シークレット参照を追加] をクリックして、関数のシークレットを設定します。
アクセスを許可するシークレットを選択します。必要に応じて、シークレットを作成します。
関数と同じプロジェクト内のシークレットを参照するには:
- プルダウン リストからシークレットを選択します。
別のプロジェクトのシークレットを参照するには:
プロジェクトのサービス アカウントにシークレットへのアクセスが許可されていることを確認します。
[シークレットを手動で入力] を選択します。
シークレットのリソース ID を次の形式で入力します。
projects/PROJECT_ID/secrets/SECRET_NAME
次のように置き換えます。
PROJECT_ID: シークレットが存在するプロジェクトの ID。
SECRET_NAME: Secret Manager でのシークレットの名前。
シークレットの参照方法を選択します。シークレットをボリュームとしてマウントするか、環境変数として公開します。
シークレットをボリュームとしてマウントするには:
[ボリュームとしてマウント] を選択します。
[マウントパス] フィールドに、このシークレットのマウントパスを入力します。これは、シークレットのすべてのバージョンが配置されるディレクトリです。
[Path1] フィールドに、マウントするファイルの名前を入力します。この名前は、前の手順のマウントパスと連結されて、シークレットがマウントされる完全なマウントパスを形成します。
[Version1] プルダウンで、参照するシークレットのバージョンを選択します。
[+ 追加] をクリックして、追加のパスとそれらのパスにマウントするこのシークレットのバージョンを定義することで、このシークレットの追加バージョンをマウントできます。
シークレットを環境変数として公開するには:
[環境変数として公開] を選択します。
[Name1] フィールドに、環境変数の名前を入力します。
[Version1] プルダウンで、参照するシークレットのバージョンを選択します。
[+ 追加] をクリックして、追加の環境変数と、これらの環境変数に保存するこのシークレットのバージョンを定義することで、このシークレットの追加バージョンを関数に公開できます。
[完了] をクリックします。
[次へ] をクリックします。
[デプロイ] をクリックします。
これで、関数のコードでシークレットを参照できるようになりました。
gcloud
関数でシークレットを利用できるようにするには、次のいずれかのコマンドを入力します。
シークレットをボリュームとしてマウントするには、次のコマンドを入力します。
gcloud functions deploy FUNCTION_NAME \ --runtime RUNTIME \ --set-secrets 'SECRET_FILE_PATH=SECRET:VERSION'
次のように置き換えます。
FUNCTION_NAME: 関数の名前。
RUNTIME: 関数を実行するランタイム。
SECRET_FILE_PATH: シークレットのフルパス。たとえば、
/mnt/secrets/primary/latest
の場合、/mnt/secrets/primary/
はマウントパス、latest
はシークレットのパスです。マウントパスとシークレットのパスを別々に指定することもできます。--set-secrets 'MOUNT_PATH:SECRET_PATH=SECRET:VERSION'
SECRET: Secret Manager でのシークレットの名前。
VERSION: 使用するシークレットのバージョン。たとえば、
1
やlatest
です。
--set-secrets
フラグを指定すると、既存のシークレットがオーバーライドされます。関数の既存のシークレットを維持するには、--update-secrets
フラグを使用します。シークレットを環境変数として公開するには、次のコマンドを入力します。
gcloud functions deploy FUNCTION_NAME \ --runtime RUNTIME \ --set-secrets 'ENV_VAR_NAME=SECRET:VERSION'
次のように置き換えます。
FUNCTION_NAME: 関数の名前。
RUNTIME: 関数を実行するランタイム。
ENV_VAR_NAME: 環境変数の名前。
SECRET: Secret Manager でのシークレットの名前。
VERSION: 使用するシークレットのバージョン。たとえば、
1
やlatest
です。
--set-secrets
フラグを指定すると、既存のシークレットがオーバーライドされます。関数の既存のシークレットを維持するには、--update-secrets
フラグを使用します。関数のサービス アカウントにシークレットへのアクセスが許可されている場合は、別のプロジェクトのシークレットを参照できます。別のプロジェクトのシークレットを参照するには、シークレットのリソースパスを使用します。
gcloud functions deploy FUNCTION_NAME \ --runtime RUNTIME \ --update-secrets 'SECRET_FILE_PATH=SECRET_RESOURCE_PATH:VERSION'
次のように置き換えます。
FUNCTION_NAME: 関数の名前。
SECRET_RESOURCE_PATH: 他のプロジェクトにあるシークレットのリソースパス。リソースパスの形式は次のとおりです。
projects/PROJECT_ID/secrets/SECRET_NAME
次のように置き換えます。
PROJECT_ID: シークレットが存在するプロジェクトの ID。
SECRET_NAME: Secret Manager でのシークレットの名前。
RUNTIME: 関数を実行するランタイム。
SECRET_FILE_PATH: シークレットのフルパス。たとえば、
/mnt/secrets/primary/latest
の場合、/mnt/secrets/primary/
はマウントパス、latest
はシークレットのパスです。マウントパスとシークレットのパスを別々に指定することもできます。--set-secrets 'MOUNT_PATH:SECRET_PATH=SECRET:VERSION'
SECRET: Secret Manager でのシークレットの名前。
VERSION: 使用するシークレットのバージョン。たとえば、
1
やlatest
です。
一度に複数のシークレットを更新できます。各シークレットの構成オプションはカンマで区切ります。次のコマンドは、ボリュームとしてマウントされたシークレットと、環境変数として公開された別のシークレットを更新します。
既存のシークレットを更新するには、次のコマンドを入力します。
gcloud functions deploy FUNCTION_NAME \ --runtime RUNTIME \ --update-secrets 'ENV_VAR_NAME=SECRET:VERSION, \ SECRET_FILE_PATH=SECRET:VERSION'
次のように置き換えます。
FUNCTION_NAME: 関数の名前。
RUNTIME: 関数を実行するランタイム。
ENV_VAR_NAME: 環境変数の名前。
SECRET: Secret Manager でのシークレットの名前。
VERSION: 使用するシークレットのバージョン。たとえば、
1
やlatest
です。SECRET_FILE_PATH: シークレットのフルパス。たとえば、
/mnt/secrets/primary/latest
の場合、/mnt/secrets/primary/
はマウントパス、latest
はシークレットのパスです。マウントパスとシークレットのパスを別々に指定することもできます。--set-secrets 'MOUNT_PATH:SECRET_PATH=SECRET:VERSION'
関数からシークレットを削除する
関数からシークレットを削除するには、Google Cloud コンソールまたは gcloud CLI を使用します。
コンソール
Google Cloud コンソールの [Cloud Functions] ページに移動します。
[Cloud Functions] ページに移動関数の名前をクリックして、そのシークレットの 1 つを削除します。
[編集] をクリックします。
[ランタイム、ビルド、接続の設定] をクリックして、詳細構成オプションを開きます。
[セキュリティとイメージのリポジトリ] をクリックして [セキュリティ] タブを開きます。
削除するシークレットにポインタを合わせて、
[削除] をクリックします。[次へ] をクリックします。
[デプロイ] をクリックします。
gcloud
関数からすべてのシークレットを削除するか、削除する 1 つまたは複数のシークレットを指定します。
すべてのシークレットを削除するには、次のコマンドを実行します。
gcloud functions deploy FUNCTION_NAME \ --runtime RUNTIME \ --clear-secrets
次のように置き換えます。
FUNCTION_NAME: 関数の名前。
RUNTIME: 関数を実行するランタイム。
関数からすべてのシークレットが削除されます。
削除するシークレットのリストを指定するには、
--remove-secrets
フラグを使用します。次のコマンドは、ボリュームとしてマウントされたシークレットと、環境変数として公開された別のシークレットを削除します。gcloud functions deploy FUNCTION_NAME \ --runtime RUNTIME \ --remove-secrets='ENV_VAR_NAME,SECRET_FILE_PATH, ...'
次のように置き換えます。
FUNCTION_NAME: 関数の名前。
RUNTIME: 関数を実行するランタイム。
ENV_VAR_NAME: 環境変数の名前。
SECRET_FILE_PATH: シークレットのフルパス。たとえば、
/mnt/secrets/primary/latest
の場合、/mnt/secrets/primary/
はマウントパス、latest
はシークレットのパスです。マウントパスとシークレットのパスを別々に指定することもできます。--set-secrets 'MOUNT_PATH:SECRET_PATH=SECRET:VERSION'
指定したシークレットが関数から削除されます。
関数がアクセスできるシークレットを表示する
Google Cloud コンソールまたは gcloud CLI を使用して、関数がアクセスできるシークレットを確認できます。
コンソール
Google Cloud コンソールの [Cloud Functions] ページに移動します。
[Cloud Functions] ページに移動関数の名前をクリックすると、使用可能なシークレットが表示されます。
[編集] をクリックします。
[ランタイム、ビルド、接続の設定] をクリックして、詳細構成オプションを開きます。
[セキュリティ] をクリックして [セキュリティ] タブを開きます。
[セキュリティ] タブに、関数がアクセスできるシークレットが表示されます。
gcloud
関数で使用できるシークレットを確認するには、gcloud functions describe
コマンドを使用します。
gcloud functions describe FUNCTION_NAME
FUNCTION_NAME は、関数の名前で置き換えます。
次のステップ
- Secret Manager クライアント ライブラリを使用して Secret Manager を使用する関数を開発する。