Secret を構成する

Secret Manager を使用すると、API キー、パスワード、その他の機密情報を安全に保存できます。このガイドでは、Secret Manager に保存されているシークレットにアクセスするように Cloud Functions を構成する方法について説明します。

このドキュメントでは、関数でシークレットを利用できるようにする次の方法について説明します。

  • シークレットをボリュームとしてマウントする。これにより、関数でシークレットをファイルとして使用できるようになります。シークレットをボリュームとして参照すると、ディスクからファイルを読み取るたびに、関数が Secret Manager にアクセスし、シークレット値を取得します。このため、常に同じバージョンではなく、最新バージョンのシークレットを参照する場合は、ボリュームとしてマウントすることをおすすめします。この方法は、シークレットのローテーションを実装する場合にも役立ちます。

  • シークレットを環境変数として渡す。環境変数の値はインスタンスの起動時に解決されるため、この方法を使用する場合は、最新バージョンのシークレットを参照するのではなく、常に同じバージョンのシークレットを参照することをおすすめします。

Secret Manager の使用方法については、Secret Manager の概要をご覧ください。シークレットを作成してアクセスする方法については、シークレットを作成するをご覧ください。

始める前に

  1. Secret Manager API を有効にします。

    API を有効にする

  2. Secret Manager でシークレットをまだ作成していない場合は、シークレットを作成するの説明に従って作成します。

シークレットへのアクセスを許可する

関数から同じプロジェクトにあるシークレットにアクセスすることも、別のプロジェクトにあるシークレットにアクセスすることもできます。シークレットにアクセスするには、関数のランタイム サービス アカウントにシークレットのアクセス権を付与する必要があります。

デフォルトでは、Cloud Functions は App Engine のデフォルト サービス アカウントを使用して Secret Manager で認証を行います。本番環境で使用する場合は、関数のタスクの実行に必要な最小限のロールセットが割り当てられたユーザー管理のサービス アカウントで認証を行うように関数を構成することをおすすめします。

Cloud Functions で Secret Manager を使用するには、関数に関連付けられているサービス アカウントに roles/secretmanager.secretAccessor ロールを割り当てます。

  1. Google Cloud コンソールの [Secret Manager] ページに移動します。
    [Secret Manager] ページに移動

  2. シークレットの横にあるチェックボックスをオンにします。

  3. まだ開いていない場合は、[情報パネルを表示] をクリックしてパネルを開きます。

  4. 情報パネルで [プリンシパルを追加] をクリックします。

  5. [新しいプリンシパル] フィールドに、関数が ID に使用するサービス アカウントを入力します。関数のサービス アカウントは次のいずれかです。

  6. [ロールを選択] プルダウンで、[Secret Manager]、[Secret Manager のシークレット アクセサー] の順に選択します。

シークレットにアクセスするために関数を準備する

シークレットを関数で使用できるようにする方法は 2 つあります。

  • シークレットを環境変数として渡す。
  • シークレットをボリュームとしてマウントする。

環境変数

環境変数を使用して、関数でシークレットを利用できるようにするには:

  1. 関数のデプロイ時にランタイム環境変数を設定します。
  2. 環境変数内で、シークレットを関数からアクセスできるようにします。
  3. 実行時にプログラムによって環境変数にアクセスします。

シークレットをボリュームとしてマウントする

シークレットをボリュームとしてマウントするには:

  1. シークレットを含むファイルを作成します。

  2. シークレットのマウントパスとして、システム以外の未使用のディレクトリ(/mnt/secrets など)を選択します。そのディレクトリにある既存のファイルまたはサブディレクトリ(シークレットとそのバージョン以外)は、シークレットがマウントされるとアクセスできなくなります。

  3. シークレットをマウントされたボリュームとして関数からアクセスできるようにします。

  4. 実行時にファイルの内容をプログラムで読み取り、シークレットの値にアクセスします。

たとえば、シークレットが /mnt/secrets/secret1 にマウントされている場合、関数はこのファイルを読み取る必要があります。Node.js を使用してファイルを同期的に読み取る方法の例を次に示します。

fs.readFileSync('/mnt/secrets/secret1')

シークレットが関数にアクセスできるようにする

関数からシークレットを参照するには、まず、シークレットが関数にアクセスできるようにする必要があります。Google Cloud Console または Google Cloud CLI を使用して、シークレットが新しい関数または既存の関数にアクセスするようにできます。

コンソール

シークレットが関数にアクセスできるようにするには:

  1. Google Cloud コンソールの Cloud Functions ページに移動します。
    Cloud Functions ページに移動

  2. シークレットへのアクセスを許可する関数の名前をクリックします。

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

  4. [ランタイム、ビルド...] をクリックして、詳細な構成オプションを開きます。

  5. [セキュリティとイメージのリポジトリ] をクリックしてタブを開きます。

  6. [シークレット参照を追加] をクリックして、関数のシークレットを設定します。

  7. アクセスを許可するシークレットを選択します。必要に応じて、シークレットを作成します。

    • 関数と同じプロジェクト内のシークレットを参照するには:

      1. プルダウン リストからシークレットを選択します。
    • 別のプロジェクトのシークレットを参照するには:

      1. プロジェクトのサービス アカウントにシークレットへのアクセスが許可されていることを確認します。

      2. [シークレットを手動で入力] を選択します。

      3. シークレットのリソース ID を次の形式で入力します。

        projects/PROJECT_ID/secrets/SECRET_NAME

        次のように置き換えます。

        • PROJECT_ID: シークレットが存在するプロジェクトの ID。

        • SECRET_NAME: Secret Manager でのシークレットの名前。

  8. シークレットの参照方法を選択します。シークレットをボリュームとしてマウントするか、環境変数として公開します。

    • シークレットをボリュームとしてマウントするには:

      1. [ボリュームとしてマウント] を選択します。

      2. [マウントパス] フィールドに、このシークレットのマウントパスを入力します。これは、シークレットのすべてのバージョンが配置されるディレクトリです。

      3. [Path1] フィールドに、マウントするファイルの名前を入力します。この名前は、前の手順のマウントパスと連結されて、シークレットがマウントされる完全なマウントパスを形成します。

      4. [バージョン 1] プルダウンで、参照するシークレットのバージョンを選択します。

      5. [+ 追加] をクリックして、追加のパスとマウントするこのシークレットのバージョンを定義することで、このシークレットの追加バージョンをマウントできます。

    • シークレットを環境変数として公開するには:

      1. [環境変数として公開] を選択します。

      2. [名前 1] フィールドに、環境変数の名前を入力します。

      3. [バージョン 1] プルダウンで、参照するシークレットのバージョンを選択します。

      4. [+ 追加] をクリックして、追加の環境変数と保存するこのシークレットのバージョンを定義することで、このシークレットの追加バージョンを関数に公開できます。

  9. [完了] をクリックします。

  10. [次へ] をクリックします。

  11. [デプロイ] をクリックします。

これで、関数のコードでシークレットを参照できるようになりました。

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: 使用するシークレットのバージョン。たとえば、1latest です。

    --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: 使用するシークレットのバージョン。たとえば、1latest です。

    --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: 使用するシークレットのバージョン。たとえば、1latest です。

  • 一度に複数のシークレットを更新できます。各シークレットの構成オプションはカンマで区切ります。次のコマンドは、ボリュームとしてマウントされたシークレットと、環境変数として公開された別のシークレットを更新します。

    既存のシークレットを更新するには、次のコマンドを入力します。

    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: 使用するシークレットのバージョン。たとえば、1latest です。

    • SECRET_FILE_PATH: シークレットのフルパス。たとえば、/mnt/secrets/primary/latest の場合、/mnt/secrets/primary/ はマウントパス、latest はシークレットのパスです。マウントパスとシークレットのパスを別々に指定することもできます。

      --set-secrets 'MOUNT_PATH:SECRET_PATH=SECRET:VERSION'

関数からシークレットを削除する

関数からシークレットを削除するには、Google Cloud コンソールまたは gcloud CLI を使用します。

コンソール

  1. Google Cloud コンソールの Cloud Functions ページに移動します。
    Cloud Functions ページに移動

  2. 関数の名前をクリックして、シークレットの 1 つを削除します。

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

  4. [ランタイム、ビルド、接続の設定] をクリックして、詳細構成オプションを開きます。

  5. [セキュリティとイメージのリポジトリ] をクリックして [セキュリティ] タブを開きます。

  6. 削除するシークレットにカーソルを合わせて、 [削除] をクリックします。

  7. [次へ] をクリックします。

  8. [デプロイ] をクリックします。

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 を使用して、関数がアクセスできるシークレットを確認できます。

コンソール

  1. Google Cloud コンソールの Cloud Functions ページに移動します。
    Cloud Functions ページに移動

  2. 関数の名前をクリックすると、使用可能なシークレットが表示されます。

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

  4. [ランタイム、ビルド、接続の設定] をクリックして、詳細構成オプションを開きます。

  5. [セキュリティ] をクリックして [セキュリティ] タブを開きます。

[セキュリティ] タブには、関数にアクセス可能なシークレットが一覧表示されます。

gcloud

関数で使用できるシークレットを確認するには、gcloud functions describe コマンドを使用します。

gcloud functions describe FUNCTION_NAME

FUNCTION_NAME は、関数の名前で置き換えます。

次のステップ