インスタンスの依存関係に API キー、パスワード、証明書、または他の機密情報が必要になることがあります。Cloud Run の場合、この機密情報を Secret Manager で作成したシークレットに保存することをおすすめします。
次のいずれかの方法で、コンテナでシークレットを使用できるようにします。
- 各シークレットをボリュームとしてマウントすると、Cloud Run はシークレットをファイルとしてコンテナで利用できるようにします。ボリュームを読み取るとき、Cloud Run は常に Secret Manager からシークレット値を取得し、最新バージョンでその値を使用します。この方法はシークレット ローテーションでも有効です。
- 環境変数を使用してシークレットを渡します。環境変数はインスタンスの起動時に解決されるため、この方法を使用する場合は、バージョンとして
latestを使用するのではなく、特定のバージョンにシークレットを固定することをおすすめします。
詳細については、Secret Manager のベスト プラクティスをご覧ください。
デプロイ時とランタイムにシークレットを確認する方法
インスタンスのデプロイ時に、Cloud Run によって、使用するすべてのシークレットがチェックされます。このチェックにより、コンテナを実行するサービス アカウントにこれらのシークレットへのアクセス権があることが確認されます。
ラインタイムにインスタンスが起動したときに、次の処理が実行されます。
- シークレットが環境変数の場合、Cloud Run はインスタンスの開始前にシークレットの値を取得します。シークレットの取得プロセスが失敗した場合、インスタンスは起動しません。
- シークレットをボリュームとしてマウントする場合、Cloud Run はインスタンスの起動時にチェックを行いません。ただし、ランタイムにシークレットにアクセスできない場合、マウントされたボリュームの読み取りに失敗します。
ボリュームの所有権
Cloud Run シークレット ボリュームの所有権は、実行環境とデプロイタイプによって異なります。
第 2 世代の実行環境(インスタンスの場合)を使用して Secret Volume をマウントする場合、root がボリュームを所有します。
始める前に
Secret Manager API が有効になっていない場合は、有効にします。
API を有効にするために必要なロール
API を有効にするには、
serviceusage.services.enable権限が必要です。プロジェクトを作成した場合は、オーナーロール(roles/owner)を通じてこの権限がすでに付与されている可能性があります。それ以外の場合は、Service Usage 管理者ロール(roles/serviceusage.serviceUsageAdmin)を通じてこの権限を取得できます。ロールを付与する方法を確認する。- 既存のシークレットを使用するか、シークレットの作成の説明に沿って Secret Manager でシークレットを作成します。
必要なロール
シークレットを構成するために必要な権限を取得するには、次の IAM ロールを付与するよう管理者に依頼してください。
- Cloud Run インスタンスに対する Cloud Run 管理者 (
roles/run.admin) - サービス ID に対するサービス アカウント ユーザー(
roles/iam.serviceAccountUser)ロール
Cloud Run がシークレットにアクセスできるようにするには、サービス ID に次のロールが必要です。
- Secret Manager のシークレット アクセサー(
roles/secretmanager.secretAccessor)
サービス 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
新しいインスタンスを作成する場合は、この手順をスキップします。既存のインスタンスを更新する場合は、その YAML 構成をダウンロードします。
gcloud beta run instances describe INSTANCE --format export > instance.yaml
環境変数として公開されたシークレットの場合:
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)。
シークレットをファイルパスとしてマウントする場合:
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など)を使用します。
次のコマンドを使用して、インスタンスを新しい構成に置き換えます。
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
新しいインスタンスを作成する場合は、この手順をスキップします。既存のインスタンスを更新する場合は、その YAML 構成をダウンロードします。
gcloud beta run instances describe INSTANCE --format export > instance.yaml
環境変数として公開されたシークレットの場合:
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など)を使用します。
シークレットをファイルパスとしてマウントする場合:
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など)を使用します。
次のコマンドを使用して、インスタンスを新しい構成に置き換えます。
gcloud beta run instances replace instance.yaml
シークレットの設定を表示する
Cloud Run インスタンスの現在のシークレットの設定を表示するには:
gcloud
次のコマンドを実行します。
gcloud beta run instances describe INSTANCE
返された構成で、シークレットの設定を見つけます。
インスタンスからシークレットを削除する
インスタンスからシークレットを削除するには、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 にします。