インスタンスのシークレットを設定する

インスタンスの依存関係に API キー、パスワード、証明書、または他の機密情報が必要になることがあります。Cloud Run の場合、 Google はこの機密情報を Secret Manager で作成したシークレットに保存することをおすすめします。

次のいずれかの方法で、コンテナでシークレットを使用できるようにします。

  • 各シークレットをボリュームとしてマウントすると、Cloud Run はシークレットをファイルとしてコンテナで利用できるようにします。ボリュームを読み取るとき、Cloud Run は常に Secret Manager からシークレット値を取得し、最新バージョンでその値を使用します。この方法はシークレット ローテーションでも有効です。
  • 環境変数を使用してシークレットを渡します。環境変数はインスタンスの起動時に解決されるため、この方法を使用する場合は、バージョンとして latest を使用するのではなく、特定のバージョンにシークレットを固定することをおすすめします。

詳細については、Secret Manager のベスト プラクティスをご覧ください。

デプロイ時とランタイムにシークレットを確認する方法

インスタンスのデプロイ時に、Cloud Run によって、使用するすべてのシークレットがチェックされます。このチェックにより、コンテナを実行するサービス アカウントにこれらのシークレットへのアクセス権があることが確認されます。

ラインタイムにインスタンスが起動したときに、次の処理が実行されます。

  • シークレットが環境変数の場合、Cloud Run はインスタンスの開始前にシークレットの値を取得します。シークレットの取得プロセスが失敗した場合、インスタンスは起動しません。
  • シークレットをボリュームとしてマウントする場合、Cloud Run はインスタンスの起動時にチェックを行いません。ただし、ランタイムにシークレットにアクセスできない場合、マウントされたボリュームの読み取りに失敗します。

ボリュームの所有権

Cloud Run シークレット ボリュームの所有権は、実行環境とデプロイタイプによって異なります。

第 2 世代の実行環境(インスタンスの場合)を使用して Secret Volume をマウントする場合、root がボリュームを所有します。

始める前に

  1. Secret Manager API を有効にする。

    API を有効にするために必要なロール

    API を有効にするには、serviceusage.services.enable 権限が必要です。プロジェクトを作成した場合は、オーナーロール(roles/owner)を通じてこの権限が付与されている可能性があります。それ以外の場合は、Service Usage 管理者ロール(roles/serviceusage.serviceUsageAdmin)を通じてこの権限を取得できます。ロールを付与する方法をご覧ください

    API の有効化

  2. 既存のシークレットを使用するか、 シークレットの作成の説明に沿って Secret Manager でシークレットを作成します。

必要なロール

シークレットを構成するために必要な権限を取得するには、次の IAM ロールを付与するよう管理者に依頼してください。

Cloud Run がシークレットにアクセスできるようにするには、サービス ID に次のロールが必要です。

サービス ID プリンシパルを Secret Manager のシークレット アクセサー ロールに追加する方法については、シークレットへのアクセスを管理するをご覧ください。

Cloud Run に関連付けられている IAM ロールと権限のリストについては、Cloud Run IAM ロールCloud Run IAM 権限をご覧ください。Cloud Run インスタンスが Google Cloud API(Cloud クライアント ライブラリなど)と連携している場合は、 サービス ID の構成ガイドをご覧ください。 ロールの付与の詳細については、 デプロイ権限アクセスの管理をご覧ください。

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

新しいインスタンスをデプロイするか、既存のインスタンスを更新する際に、Google Cloud CLI または YAML を使用して、インスタンスでシークレットを利用できるようにします。

gcloud

  • インスタンスをデプロイするときにシークレットを環境変数として公開するには、次のコマンドを実行します。

    gcloud beta run instances deploy INSTANCE \
      --image IMAGE_URL \
      --update-secrets=ENV_VAR_NAME=SECRET_NAME:VERSION

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

    • INSTANCE: インスタンスの名前。
    • IMAGE_URL: コンテナ イメージへの参照(us-docker.pkg.dev/cloudrun/container/hello:latest など)。
    • ENV_VAR_NAME: シークレットで使用する環境変数の名前。
    • SECRET_NAME: 同じプロジェクト内のシークレット名(例: mysecret)。
    • VERSION: シークレットのバージョン。最新バージョンには latest または数字(2 など)を使用します。
  • 複数のシークレットを同時に更新するには、各シークレットの構成オプションをカンマで区切ります。次のコマンドは、ボリュームとしてマウントされたシークレットと、環境変数として公開された別のシークレットを更新します。既存のシークレットを更新するには、次のコマンドを実行します。

    gcloud beta run instances deploy INSTANCE \
    --image IMAGE_URL \
    --update-secrets=PATH=SECRET_NAME:VERSION,ENV_VAR_NAME=SECRET_NAME:VERSION
  • 既存のシークレットをクリアして、インスタンスで新しいシークレットを利用できるようにするには、--set-secrets フラグを使用します。

    gcloud beta run instances update INSTANCE \
     --set-secrets="ENV_VAR_NAME=SECRET_NAME:VERSION"

YAML

  1. 新しいインスタンスを作成する場合は、この手順をスキップします。 既存のインスタンスを更新する場合は、その YAML 構成をダウンロードします。

    gcloud beta run instances describe INSTANCE --format export > instance.yaml
  2. 環境変数として公開されたシークレットの場合:

    apiVersion: run.googleapis.com/v1
    kind: Instance
    metadata:
      name: INSTANCE
      annotations:
        run.googleapis.com/launch-stage: BETA
    spec:
      containers:
      - image: IMAGE_URL
        env:
        - name: ENV_VAR
          valueFrom:
            secretKeyRef:
              key: SECRET_VERSION
              name: SECRET_NAME

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

    • INSTANCE: Cloud Run インスタンスの名前。
    • IMAGE_URL: コンテナ イメージへの参照(us-docker.pkg.dev/cloudrun/container/hello:latest など)。
    • ENV_VAR: 環境変数の名前。
    • SECRET_VERSION: シークレットのバージョン。最新バージョンには latest または数字(2 など)を使用します。
    • SECRET_NAME: シークレット名(例: mysecret)。
  3. シークレットをファイルパスとしてマウントする場合:

    apiVersion: run.googleapis.com/v1
    kind: Instance
    metadata:
      name: INSTANCE
      annotations:
        run.googleapis.com/launch-stage: BETA
    spec:
      containers:
      - image: IMAGE_URL
        volumeMounts:
        - name: VOLUME_NAME
          mountPath: MOUNT_PATH
      volumes:
      - name: VOLUME_NAME
        secret:
          secretName: SECRET_NAME
          items:
          - key: SECRET_VERSION
            path: SECRET_NAME

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

    • INSTANCE: Cloud Run インスタンスの名前。
    • IMAGE_URL: コンテナ イメージへの参照(us-docker.pkg.dev/cloudrun/container/hello:latest など)。
    • VOLUME_NAME: ボリュームに付ける名前。
    • MOUNT_PATH: ボリュームをマウントする相対パス(/mnt/my-volume など)。
    • SECRET_NAME: シークレット名(例: mysecret)。
    • SECRET_VERSION: シークレットのバージョン。最新バージョンには latest または数字(2 など)を使用します。
  4. 次のコマンドを使用して、インスタンスを新しい構成に置き換えます。

    gcloud beta run services replace service.yaml

他のプロジェクトのシークレットを参照する

別のプロジェクトのシークレットを参照するには、プロジェクトのインスタンス アカウントにシークレットへのアクセス権があることを確認します

gcloud

シークレットを環境変数として参照するには、次のコマンドを実行します。

gcloud beta run instances deploy INSTANCE \
    --image IMAGE_URL \
    --update-secrets=ENV_VAR_NAME=projects/PROJECT_NUMBER/secrets/SECRET_NAME:VERSION

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

  • INSTANCE: インスタンスの名前。
  • IMAGE_URL: コンテナ イメージへの参照(us-docker.pkg.dev/cloudrun/container/hello:latest など)。
  • PROJECT_NUMBER: シークレットが作成された プロジェクトのプロジェクト番号。
  • SECRET_NAME: シークレット名(例: mysecret)。
  • VERSION: シークレットのバージョン。最新バージョンには latest または数字(2 など)を使用します。

YAML

  1. 新しいインスタンスを作成する場合は、この手順をスキップします。 既存のインスタンスを更新する場合は、その YAML 構成をダウンロードします。

    gcloud beta run instances describe INSTANCE --format export > instance.yaml
  2. 環境変数として公開されたシークレットの場合:

    apiVersion: run.googleapis.com/v1
    kind: Instance
    metadata:
      name: INSTANCE
      annotations:
        run.googleapis.com/launch-stage: BETA
        metadata:
          annotations:
            run.googleapis.com/secrets: SECRET_LOOKUP_NAME:projects/PROJECT_NUMBER/secrets/SECRET_NAME
        spec:
          containers:
          - image: IMAGE_URL
            env:
            - name: ENV_VAR
              valueFrom:
                secretKeyRef:
                  key: SECRET_VERSION
                  name: SECRET_LOOKUP_NAME

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

    • INSTANCE: Cloud Run インスタンスの名前。
    • SECRET_LOOKUP_NAME: 有効なシークレット名の構文を持つ任意の名前(my-secret など)。SECRET_NAME と同じ値にすることもできます。
    • PROJECT_NUMBER: シークレットが作成されたプロジェクトのプロジェクト番号。
    • SECRET_NAME: シークレット名(例: mysecret)。
    • IMAGE_URL: コンテナ イメージへの参照(us-docker.pkg.dev/cloudrun/container/hello:latest など)。
    • ENV_VAR: 環境変数の名前。
    • SECRET_VERSION: シークレットのバージョン。最新バージョンには latest または数字(2 など)を使用します。
  3. シークレットをファイルパスとしてマウントする場合:

    apiVersion: run.googleapis.com/v1
    kind: Instance
    metadata:
      name: INSTANCE
      annotations:
        run.googleapis.com/launch-stage: BETA
    metadata:
      annotations:
        run.googleapis.com/secrets: SECRET_LOOKUP_NAME:projects/PROJECT_NUMBER/secrets/SECRET_NAME
    spec:
      containers:
      - image: IMAGE_URL
        volumeMounts:
        - name: VOLUME_NAME
          mountPath: MOUNT_PATH
      volumes:
      - name: VOLUME_NAME
        secret:
          secretName: SECRET_NAME
          items:
          - key: SECRET_VERSION
            path: SECRET_LOOKUP_NAME

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

    • INSTANCE: Cloud Run インスタンスの名前。
    • SECRET_LOOKUP_NAME: 有効なシークレット名の構文を持つ任意の名前(my-secret など)。SECRET_NAME と同じ値にすることもできます。
    • PROJECT_NUMBER: シークレットが作成されたプロジェクトのプロジェクト番号。
    • SECRET_NAME: シークレット名(例: mysecret)。
    • IMAGE_URL: コンテナ イメージへの参照(us-docker.pkg.dev/cloudrun/container/hello:latest など)。
    • VOLUME_NAME: ボリュームに付ける名前。
    • MOUNT_PATH: ボリュームをマウントする相対パス(/mnt/my-volume など)。
    • SECRET_VERSION: シークレットのバージョン。最新バージョンには latest または数字(2 など)を使用します。
  4. 次のコマンドを使用して、インスタンスを新しい構成に置き換えます。

    gcloud beta run instances replace instance.yaml

シークレットの設定を表示する

Cloud Run インスタンスの現在のシークレットの設定を表示するには:

gcloud

  1. 次のコマンドを使用します。

    gcloud beta run instances describe INSTANCE
  2. 返された構成で、シークレットの設定を見つけます。

インスタンスからシークレットを削除する

インスタンスからシークレットを削除するには、gcloud CLI を使用します。

gcloud

インスタンスからすべてのシークレットを削除するか、削除する 1 つまたは複数のシークレットを指定します。

すべてのシークレットを削除するには、次のコマンドを実行します。

  gcloud beta run instances deploy INSTANCE --image IMAGE_URL \
      --clear-secrets

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

  • INSTANCE: インスタンスの名前。
  • IMAGE_URL: コンテナ イメージへの参照(us-docker.pkg.dev/cloudrun/container/hello:latest など)。

削除するシークレットのリストを指定するには、--remove-secrets フラグを使用します。次のコマンドは、ボリュームとしてマウントされたシークレットと、環境変数として公開された別のシークレットを削除します。

  gcloud beta run instances deploy INSTANCE --image IMAGE_URL \
      --remove-secrets=ENV_VAR_NAME,SECRET_FILE_PATH

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

  • INSTANCE: インスタンスの名前。
  • IMAGE_URL: コンテナ イメージへの参照(us-docker.pkg.dev/cloudrun/container/hello:latest など)。
  • ENV_VAR_NAME: 環境変数の名前。
  • SECRET_FILE_PATH: シークレットのフルパス。たとえば、/mnt/secrets/primary/latest の場合、/mnt/secrets/primary/ はマウントパス、latest はシークレットのパスです。マウントパスとシークレットのパスを別々に指定することもできます。

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

コードでシークレットを使用する

コード内でシークレットを環境変数としてアクセスする例については、エンドユーザー認証に関するチュートリアル、特に Secret Manager で機密性の高い構成を処理するのセクションをご覧ください。

制限事項

以降のセクションでは、シークレットのマウントに適用される制限事項について説明します。

使用できないパス

  • Cloud Run では、/dev/proc/sys、またはそのサブディレクトリにシークレットをマウントすることはできません。
  • Cloud Run では、複数のボリューム マウントを同じ場所にマウントできないため、複数のシークレットを同じパスにマウントすることはできません。

リージョン シークレット

Cloud Run はリージョン シークレットをサポートしていません。

ディレクトリのオーバーライド

Cloud Run でシークレットがボリュームとしてマウントされ、ボリューム マウント パスの最後のディレクトリがすでに存在する場合、既存のディレクトリ内のファイルまたはフォルダにアクセスできなくなります。

たとえば、my-secret という名前のシークレットがパス /etc/app_data にマウントされている場合、app_data ディレクトリ内のすべてのコンテンツが上書きされ、表示されるファイルは /etc/app_data/my-secret のみになります。

既存のディレクトリ内のファイルを上書きしないようにするには、シークレットをマウントするディレクトリ(/etc/app_data/secrets など)を新たに作成し、シークレットのマウントパスを /etc/app_data/secrets/my-secret にします。