シークレットを構成する

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

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

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

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

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

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

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

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

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

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

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

既存の Secret Manager シークレットを使用するか、新しいシークレットを作成できます。ただし、シークレットにアクセスするには、Cloud Run サービス ID に使用するサービス アカウントに Secret Manager のシークレット アクセサー ロールを付与する必要があります。

Google Cloud コンソールの [Cloud Run] ページでシークレットを選択すると、権限チェックが自動的に行われ、不足している権限の追加を求められます。

この操作を手動で行うには:

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

    Secret Manager に移動

  2. リスト内のシークレットをクリックします。

  3. [権限] タブで、[アクセス権を付与] をクリックします。

  4. [新しいプリンシパル] テキスト ボックスに、Cloud Run サービス ID のメールアドレスを入力します。

  5. Secret Manager のシークレット アクセサーのロールを付与します。

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 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 の互換性には制約があるため、シークレットの場所はアノテーションに保存する必要があります。

gcloud run jobs describe --format export コマンドを使用して既存のジョブ構成をダウンロードして表示します。読みやすく整えられた結果が YAML 形式で出力されます。次に、下記のフィールドを変更して、gcloud run jobs replace コマンドで変更後の YAML ファイルをアップロードします。必ず説明されているとおりにフィールドを変更してください。

  1. 次のコマンドで、構成を表示してダウンロードします。

    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 の形式は REGION-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 の形式は REGION-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 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 の形式は REGION-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

gcloud run jobs describe --format export コマンドを使用して既存のジョブ構成をダウンロードして表示します。読みやすく整えられた結果が YAML 形式で出力されます。次に、下記のフィールドを変更して、gcloud run jobs replace コマンドで変更後の YAML ファイルをアップロードします。必ず説明されているとおりにフィールドを変更してください。

  1. 構成を表示してダウンロードするには:

    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 の形式は REGION-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 の形式は REGION-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. 構成の詳細でシークレットの設定を見つけます。

コマンドライン

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

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

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

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

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

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