シークレットを構成する

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

コンテナでシークレットを使用するには、次の 2 つの方法があります。

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

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

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

ジョブの作成時に、環境変数として使用されるシークレットまたはボリュームとしてマウントされたシークレットがすべてチェックされ、コンテナの実行に使用されるサービス アカウントがそれらにアクセスできることを確認します。いずれかのチェックに失敗すると、ジョブの作成は失敗します。

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

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

ボリュームの所有権は実行環境とデプロイタイプによって異なる

第 2 世代の実行環境(ジョブの場合)を使用してボリュームをマウントする場合、ボリュームは root に所有されます。

始める前に

既存の Secret Manager シークレットを使用するか、新しいシークレットを作成できます。

必要なロール

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

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

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

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

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

Google Cloud コンソール、Google Cloud CLI、または YAML を使用して、ジョブでシークレットを利用できるようにします。

コンソール

  1. Google Cloud コンソールで Cloud Run の [ジョブ] ページに移動します。

    Cloud Run に移動

  2. [コンテナをデプロイ] をクリックし、[ジョブ] を選択して、ジョブの初期設定ページに入力します。既存のジョブを構成する場合は、ジョブをクリックして [編集] をクリックします。

  3. [コンテナ、変数とシークレット、接続、セキュリティ] をクリックして、ジョブのプロパティ ページを開きます。

  4. [変数とシークレット] タブをクリックします。

    イメージ

    • [変数とシークレット] タブで、次の操作を行います。
      • [シークレット] で、[シークレット参照を追加] をクリックします。
      • [シークレット] プルダウン リストから、使用するシークレットを選択します。
      • [参照の方法] プルダウン メニューで、シークレットの使用方法を選択します(ボリュームとしてマウントするか、環境変数として公開します)。
      • シークレットをボリュームとしてマウントする場合:
        1. [マウントパス] で、シークレットに使用するマウントパスを指定します。
        2. デフォルトでは最新バージョンが選択されます。必要に応じて特定のバージョンを選択できます。[シークレット バージョンに指定されているパス] で、バージョンへのパスとバージョン番号を指定します。
        3. [完了] をクリックします。
      • シークレットを環境変数として公開する場合:
        1. 変数の名前を指定し、シークレット バージョンを選択します。常に現在のシークレット バージョンを使用する場合は、latest に設定します。
        2. [完了] をクリックします。
  5. [作成] または [更新] をクリックします。

gcloud

  • 新しいジョブを作成するときに、環境変数でシークレットを指定するには:

    gcloud run jobs create JOB_NAME \
    --image IMAGE_URL \
    --set-secrets ENV_VAR_NAME=SECRET_NAME:VERSION

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

    • JOB_NAME: ジョブの名前。
    • ENV_VAR_NAME: シークレットに使用する環境変数の名前。
    • SECRET_NAME は、同じプロジェクト内のシークレット名に置き換えます(例: mysecret)。
    • VERSION は、シークレットのバージョンに置き換えます。最新バージョンには latest または数字(2 など)を使用します。
    • IMAGE_URL は、コンテナ イメージへの参照(us-docker.pkg.dev/cloudrun/container/job:latest など)に置き換えます。

    カンマ区切りのリストを使用して、複数の環境変数 / シークレットのペアを指定できます。

  • ジョブを更新するときに、環境変数でシークレットを指定するには:

    gcloud run jobs update JOB_NAME \
    --set-secrets ENV_VAR_NAME=SECRET_NAME:VERSION
  • ジョブの作成時にシークレットをボリュームとしてマウントするには:

    gcloud run jobs create JOB_NAME \
    --image IMAGE_URL \
    --set-secrets=PATH=SECRET_NAME:VERSION

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

    • JOB_NAME は、ジョブの名前に置き換えます。
    • IMAGE_URL は、コンテナ イメージへの参照(us-docker.pkg.dev/cloudrun/container/job:latest など)で置き換えます。
    • PATH は、ボリュームのマウントパスとシークレットのファイル名で置き換えます。先頭にスラッシュを付ける必要があります(例: /etc/secrets/dbconfig/password)。ここで、/etc/secrets/dbconfig/ はボリュームのマウントパス、password はシークレットのファイル名です。
    • SECRET_NAME は、同じプロジェクト内のシークレット名に置き換えます(例: mysecret)。
    • VERSION は、シークレットのバージョンに置き換えます。最新バージョンには latest または数字(2 など)を使用します。
  • 既存のジョブのシークレットを更新するには:

    gcloud run jobs update JOB_NAME \
    --update-secrets=PATH=SECRET_NAME:VERSION

YAML

API の互換性には制約があるため、シークレットの場所はアノテーションに保存する必要があります。

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

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

    apiVersion: run.googleapis.com/v1
    kind: Job
    metadata:
      name: JOB
    spec:
      template:
        spec:
          template:
            spec:
              containers:
              - env:
                - name: SECRET_NAME
                  valueFrom:
                    secretKeyRef:
                      key: VERSION
                      name: SECRET_LOOKUP_NAME
                image: IMAGE_URL 

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

    • JOB: ジョブの名前。
    • IMAGE_URL: コンテナ イメージへの参照(us-docker.pkg.dev/cloudrun/container/hello:latest など)。Artifact Registry を使用する場合は、リポジトリ REPO_NAME がすでに作成されている必要があります。URL の形式は LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG です。
    • SECRET_NAME は、mysecret などのシークレット名に置き換えます。
    • VERSION は、シークレットのバージョンに置き換えます。最新バージョンには latest または数字(2 など)を使用します。
    • SECRET_LOOKUP_NAME は、有効なシークレット名の構文を持つ任意の名前(my-secret など)で置き換えます。SECRET_NAME と同じ値にすることもできます。
  3. シークレットをファイルパスとしてマウントする場合:

    apiVersion: run.googleapis.com/v1
    kind: Job
    metadata:
      name: JOB_NAME
    spec:
      template:
        spec:
          template:
            spec:
              containers:
              - image: IMAGE_URL
                volumeMounts:
                - mountPath: MOUNT_PATH
                  name: VOLUME_NAME
              volumes:
              - name: VOLUME_NAME
                secret:
                  items:
                  - key: VERSION
                    path: FILENAME
                  secretName: SECRET_LOOKUP_NAME

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

    • JOB_NAME: ジョブの名前。
    • IMAGE_URL: コンテナ イメージへの参照(us-docker.pkg.dev/cloudrun/container/hello:latest など)。Artifact Registry を使用する場合は、リポジトリ REPO_NAME がすでに作成されている必要があります。URL の形式は LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG です。
    • PATH は、ボリュームのマウントパスとシークレットのファイル名で置き換えます。先頭にスラッシュを付ける必要があります(例: /etc/secrets/dbconfig/password)。ここで、/etc/secrets/dbconfig/ はボリュームのマウントパス、password はシークレットのファイル名です。
    • PROJECT_NUMBER は、シークレットが作成されたプロジェクトのプロジェクト番号に置き換えます。
    • SECRET_NAME は、mysecret などのシークレット名に置き換えます。
    • VERSION は、シークレットのバージョンに置き換えます。最新バージョンには latest または数字(2 など)を使用します。
    • SECRET_LOOKUP_NAME は、有効なシークレット名の構文を持つ任意の名前(my-secret など)で置き換えます。SECRET_NAME と同じ値にすることもできます。
    • VOLUME_NAME は任意の名前(my-volume など)で置き換えます。SECRET_NAME と同じ値にすることもできます。

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

プロジェクトのサービス アカウントにシークレットへのアクセスが許可されている場合、別のプロジェクトのシークレットを参照できます。

コンソール

  1. Google Cloud コンソールで Cloud Run の [ジョブ] ページに移動します。

    Cloud Run に移動

  2. [コンテナをデプロイ] をクリックし、[ジョブ] を選択して、ジョブの初期設定ページに入力します。既存のジョブを構成する場合は、ジョブをクリックして [編集] をクリックします。

  3. [コンテナ、変数とシークレット、接続、セキュリティ] をクリックして、ジョブのプロパティ ページを開きます。

  4. [変数とシークレット] タブをクリックします。

    イメージ

    • [変数とシークレット] タブで、次の操作を行います。
      • [シークレット] で、[シークレット参照を追加] をクリックします。
      • [シークレット] のプルダウン リストから [シークレットを手動で入力] を選択し、次のフォームを表示します。

        プロジェクト間のシークレット

      • [リソース ID による Secret の追加] フォームに、他のプロジェクトのシークレットを projects/PROJECT_NUMBER/secrets/SECRET_NAME の形式で入力します。他のプロジェクトのリソース ID が利用可能な場合は、それをコピーして貼り付けることができます。その場合、シークレットを選択してから、シークレットの右側にある [アクション] をクリックし、プルダウン メニューから [リソース ID をコピー] を選択します。
      • [シークレットを追加] をクリックします。
      • [参照の方法] プルダウン メニューで、シークレットの使用方法を選択します(ボリュームとしてマウントするか、環境変数として公開します)。
      • シークレットをボリュームとしてマウントする場合:
        1. [マウントパス] で、シークレットに使用するマウントパスを指定します。
        2. デフォルトでは最新バージョンが選択されます。必要に応じて特定のバージョンを選択できます。[シークレット バージョンに指定されているパス] で、バージョンへのパスとバージョン番号を指定します。
        3. [完了] をクリックします。
      • シークレットを環境変数として公開する場合:
        1. 変数の名前を指定し、シークレット バージョンを選択します。常に現在のシークレット バージョンを使用する場合は、latest に設定します。
        2. [完了] をクリックします。
  5. [作成] または [更新] をクリックします。

gcloud

  • ジョブを更新するときにシークレットをボリュームとしてマウントするには:

    gcloud run jobs update JOB_NAME \
    --image IMAGE_URL \
    --update-secrets=PATH=projects/PROJECT_NUMBER/secrets/SECRET_NAME:VERSION
    • JOB_NAME: ジョブの名前。
    • IMAGE_URL: コンテナ イメージへの参照(us-docker.pkg.dev/cloudrun/container/hello:latest など)。Artifact Registry を使用する場合は、リポジトリ REPO_NAME がすでに作成されている必要があります。URL の形式は LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG です。
    • PATH は、ボリュームのマウントパスとシークレットのファイル名で置き換えます。先頭にスラッシュを付ける必要があります(例: /etc/secrets/dbconfig/password)。ここで、/etc/secrets/dbconfig/ はボリュームのマウントパス、password はシークレットのファイル名です。
    • PROJECT_NUMBER は、シークレットが作成されたプロジェクトのプロジェクト番号に置き換えます。
    • SECRET_NAME は、mysecret などのシークレット名に置き換えます。
    • VERSION は、シークレットのバージョンに置き換えます。最新バージョンには latest または数字(2 など)を使用します。

YAML

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

    gcloud run jobs describe JOB_NAME --format export > job.yaml

API の互換性には制約があるため、シークレットの場所はアノテーションに保存する必要があります。

  1. 環境変数として公開されたシークレットの場合:

    apiVersion: run.googleapis.com/v1
    kind: Job
    metadata:
      name: JOB
    spec:
      template:
        metadata:
          annotations:
            run.googleapis.com/secrets: SECRET_LOOKUP_NAME:projects/PROJECT_NUMBER/secrets/SECRET_NAME
        spec:
          template:
            spec:
              containers:
              - env:
                - name: SECRET_NAME
                  valueFrom:
                    secretKeyRef:
                      key: VERSION
                      name: SECRET_LOOKUP_NAME
                image: IMAGE_URL 

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

    • JOB: ジョブの名前。
    • IMAGE_URL: コンテナ イメージへの参照(us-docker.pkg.dev/cloudrun/container/hello:latest など)。Artifact Registry を使用する場合は、リポジトリ REPO_NAME がすでに作成されている必要があります。URL の形式は LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG です。
    • SECRET_NAME は、mysecret などのシークレット名に置き換えます。
    • VERSION は、シークレットのバージョンに置き換えます。最新バージョンには latest または数字(2 など)を使用します。
    • PROJECT_NUMBER は、シークレットが作成されたプロジェクトのプロジェクト番号に置き換えます。
    • SECRET_LOOKUP_NAME は、有効なシークレット名の構文を持つ任意の名前(my-secret など)で置き換えます。SECRET_NAME と同じ値にすることもできます。
  2. シークレットをファイルパスとしてマウントする場合:

    apiVersion: run.googleapis.com/v1
    kind: Job
    metadata:
      name: JOB_NAME
    spec:
      template:
        metadata:
          annotations:
            run.googleapis.com/secrets: SECRET_LOOKUP_NAME:projects/PROJECT_NUMBER/secrets/SECRET_NAME
        spec:
          template:
            spec:
              containers:
              - image: IMAGE_URL
                volumeMounts:
                - mountPath: MOUNT_PATH
                  name: VOLUME_NAME
              volumes:
              - name: VOLUME_NAME
                secret:
                  items:
                  - key: VERSION
                    path: FILENAME
                  secretName: SECRET_LOOKUP_NAME

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

    • JOB_NAME: ジョブの名前。
    • IMAGE_URL: コンテナ イメージへの参照(us-docker.pkg.dev/cloudrun/container/hello:latest など)。Artifact Registry を使用する場合は、リポジトリ REPO_NAME がすでに作成されている必要があります。URL の形式は LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG です。
    • PATH は、ボリュームのマウントパスとシークレットのファイル名で置き換えます。先頭にスラッシュを付ける必要があります(例: /etc/secrets/dbconfig/password)。ここで、/etc/secrets/dbconfig/ はボリュームのマウントパス、password はシークレットのファイル名です。
    • PROJECT_NUMBER は、シークレットが作成されたプロジェクトのプロジェクト番号に置き換えます。
    • SECRET_NAME は、mysecret などのシークレット名に置き換えます。
    • VERSION は、シークレットのバージョンに置き換えます。最新バージョンには latest または数字(2 など)を使用します。
    • SECRET_LOOKUP_NAME は、有効なシークレット名の構文を持つ任意の名前(my-secret など)で置き換えます。SECRET_NAME と同じ値にすることもできます。
    • VOLUME_NAME は任意の名前(my-volume など)で置き換えます。SECRET_NAME と同じ値にすることもできます。

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

Cloud Run ジョブの現在のシークレットの設定を表示するには:

コンソール

  1. Google Cloud コンソールで Cloud Run の [ジョブ] ページに移動します。

    Cloud Run の [ジョブ] に移動

  2. 目的のジョブをクリックして、[ジョブの詳細] ページを開きます。

  3. [構成] タブをクリックします。

  4. 構成の詳細でシークレットの設定を見つけます。

gcloud

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

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

許可されていないパスと制限

Cloud Run では、/dev/proc/sys、またはそのサブディレクトリにシークレットをマウントすることはできません。

/tmp にシークレットをマウントし、第 1 世代の実行環境を使用している場合は、/tmp へのシークレットのマウントに関する既知の問題をご覧ください。

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 にします。