ワーカー プールで、依存関係に 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 に所有されます。
始める前に
-
Enable the Secret Manager API.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin
), which contains theserviceusage.services.enable
permission. Learn how to grant roles. - 既存のシークレットを使用するか、シークレットの作成の説明に沿って 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 コンソールまたは Google Cloud CLI を使用して、ワーカープールでシークレットを利用できるようにします。目的のタブをクリックします。
コンソール
Google Cloud コンソールで Cloud Run に移動します。
メニューから [ワーカープール] を選択し、[コンテナをデプロイ] をクリックして新しいワーカープールを構成します。最初のワーカープール設定ページに入力してから、[コンテナ、ボリューム、ネットワーキング、セキュリティ] をクリックして構成ページを開きます。
既存のワーカープールを構成する場合は、ワーカープールをクリックし、[新しいリビジョンの編集とデプロイ] をクリックします。
手順に沿って、シークレットをボリュームとしてマウントするか、シークレットを環境変数として公開します。
シークレットを環境変数として公開するには:
- [コンテナ] タブをクリックします。
- [変数とシークレット] タブで、[シークレットを参照] をクリックします。
- [名前 1] フィールドに、環境変数の名前を入力します。
- [シークレット] リストから、使用するシークレットを選択します。
- [バージョン 1] リストから、参照するシークレットのバージョンを選択します。
- [完了] をクリックします。
- [作成] または [デプロイ] をクリックします。
シークレットをボリュームとしてマウントするには:
- [ボリューム] タブをクリックし、[ボリュームを追加] を選択します。
- [ボリュームのタイプ] リストから、[シークレット] を選択します。
- [ボリューム名] フィールドに名前を入力するか、デフォルト名を使用します。
- [シークレット] リストから、使用するシークレットを選択します。
- [パス 1] フィールドに、マウントするファイルの名前を入力します。
- [バージョン 1] リストで、参照するシークレットのバージョンを選択します。デフォルトでは最新バージョンが選択されます。必要に応じて特定のバージョンを選択できます。
- [完了] をクリックします。
- [コンテナ] タブに移動して、シークレットをコンテナにマウントします。
- [ボリュームのマウント] タブで、[ボリュームをマウント] をクリックします。
- [名前 1] リストからボリューム名を選択します。
- [マウントパス 1] フィールドに、このシークレットのマウントパスを入力します。これは、シークレットのすべてのバージョンが配置されるディレクトリです。
- [完了] をクリックします。
- [作成] または [デプロイ] をクリックします。
gcloud
ワーカー プールをデプロイするときにシークレットを環境変数として公開するには、次のコマンドを実行します。
gcloud beta run worker-pools deploy WORKER_POOL \ --image IMAGE_URL \ --update-secrets=ENV_VAR_NAME=SECRET_NAME:VERSION
次のように置き換えます。
WORKER_POOL
: ワーカープールの名前。- IMAGE_URL: ワーカープールを含むコンテナ イメージへの参照(
us-docker.pkg.dev/cloudrun/container/worker-pool:latest
など)。 ENV_VAR_NAME
: シークレットで使用する環境変数の名前。SECRET_NAME
: 同じプロジェクト内のシークレット名(例:mysecret
)。VERSION
: シークレットのバージョン。最新バージョンにはlatest
または数字(2
など)を使用します。
複数のシークレットを同時に更新するには、各シークレットの構成オプションをカンマで区切ります。次のコマンドは、ボリュームとしてマウントされたシークレットと、環境変数として公開された別のシークレットを更新します。既存のシークレットを更新するには、次のコマンドを実行します。
gcloud beta run worker-pools deploy WORKER_POOL \ --image IMAGE_URL \ --update-secrets=PATH=SECRET_NAME:VERSION,ENV_VAR_NAME=SECRET_NAME:VERSION
既存のシークレットをクリアして、ワーカープールで新しいシークレットを利用できるようにするには、
--set-secrets
フラグを使用します。gcloud beta run worker-pools update WORKER_POOL \ --set-secrets="ENV_VAR_NAME=SECRET_NAME:VERSION"
他のプロジェクトのシークレットを参照する
別のプロジェクトのシークレットを参照するには、プロジェクトのワーカープール アカウントにシークレットへのアクセス権があることを確認します。
コンソール
Google Cloud コンソールで Cloud Run に移動します。
メニューから [ワーカープール] を選択し、[コンテナをデプロイ] をクリックして新しいワーカープールを構成します。最初のワーカープール設定ページに入力してから、[コンテナ、ボリューム、ネットワーキング、セキュリティ] をクリックして構成ページを開きます。
既存のワーカープールを構成する場合は、ワーカープールをクリックし、[新しいリビジョンの編集とデプロイ] をクリックします。
手順に沿って、シークレットをボリュームとしてマウントするか、シークレットを環境変数として公開します。
シークレットを環境変数として公開するには:
- [コンテナ] タブをクリックします。
- [変数とシークレット] タブで、[シークレットを参照] をクリックします。
- [名前 1] フィールドに、環境変数の名前を入力します。
- [シークレット] リストで、[シークレットを手動で入力] をクリックします。
シークレットのリソース ID を次の形式で入力します。
projects/PROJECT_NUMBER/secrets/SECRET_NAME
次のように置き換えます。
PROJECT_NUMBER: Google Cloud プロジェクト番号。プロジェクト番号を確認する方法の詳細については、プロジェクトの作成と管理をご覧ください。
SECRET_NAME: Secret Manager でのシークレットの名前。
[バージョン 1] リストから、参照するシークレットのバージョンを選択します。
[完了] をクリックします。
[作成] または [デプロイ] をクリックします。
シークレットをボリュームとしてマウントするには:
- [ボリューム] タブをクリックし、[ボリュームを追加] を選択します。
- [ボリュームのタイプ] リストから、[シークレット] を選択します。
- [ボリューム名] フィールドに名前を入力するか、デフォルト名を使用します。
- [シークレット] リストで、[シークレットを手動で入力] をクリックします。
シークレットのリソース ID を次の形式で入力します。
projects/PROJECT_NUMBER/secrets/SECRET_NAME
次のように置き換えます。
PROJECT_NUMBER: Google Cloud プロジェクト番号。プロジェクト番号を確認する方法の詳細については、プロジェクトの作成と管理をご覧ください。
SECRET_NAME: Secret Manager でのシークレットの名前。
[パス 1] フィールドに、マウントするファイルの名前を入力します。
[バージョン 1] リストで、参照するシークレットのバージョンを選択します。デフォルトでは最新バージョンが選択されます。必要に応じて特定のバージョンを選択できます。
[完了] をクリックします。
[コンテナ] タブに移動して、シークレットをコンテナにマウントします。
[ボリュームのマウント] タブで、[ボリュームをマウント] をクリックします。
[名前 1] リストからボリューム名を選択します。
[マウントパス 1] フィールドに、このシークレットのマウントパスを入力します。これは、シークレットのすべてのバージョンが配置されるディレクトリです。
[完了] をクリックします。
[作成] または [デプロイ] をクリックします。
gcloud
シークレットを環境変数として参照するには、次のコマンドを実行します。
gcloud beta run worker-pools deploy WORKER_POOL \ --image IMAGE_URL \ --update-secrets=ENV_VAR_NAME=projects/PROJECT_NUMBER/secrets/SECRET_NAME:VERSION
次のように置き換えます。
WORKER_POOL
: ワーカープールの名前。- IMAGE_URL: ワーカープールを含むコンテナ イメージへの参照(
us-docker.pkg.dev/cloudrun/container/worker-pool:latest
など)。 PROJECT_NUMBER
は、シークレットが作成されたプロジェクトのプロジェクト番号に置き換えます。SECRET_NAME
: シークレット名(例:mysecret
)。VERSION
: シークレットのバージョン。最新バージョンにはlatest
または数字(2
など)を使用します。
シークレットの設定を表示する
Cloud Run ワーカープールの現在のシークレットの設定を表示するには:
コンソール
Google Cloud コンソールで、Cloud Run の [ワーカー プール] ページに移動します。
目的のワーカープールをクリックして、[ワーカープールの詳細] ページを開きます。
[新しいリビジョンの編集とデプロイ] をクリックします。
構成の詳細でシークレットの設定を見つけます。
gcloud
次のコマンドを使用します。
gcloud beta run worker-pools describe WORKER_POOL
返された構成で、シークレットの設定を見つけます。
ワーカープールからシークレットを削除する
ワーカープールからシークレットを削除するには、 Google Cloud コンソールまたは gcloud CLI を使用します。
コンソール
Google Cloud コンソールで Cloud Run に移動します。
リストからワーカープールを選択し、[新しいリビジョンの編集とデプロイ] をクリックします。
[コンテナ] タブをクリックします。
ボリュームとしてマウントされたシークレットを削除するには、[ボリューム マウント] タブを選択し、削除するシークレットにポインタを合わせて、
[削除] をクリックします。環境変数として公開されているシークレットを削除するには、[変数とシークレット] タブを選択し、削除するシークレットにポインタを合わせて、
[削除] をクリックします。[デプロイ] をクリックします。
gcloud
ワーカープールからすべてのシークレットを削除するか、削除する 1 つまたは複数のシークレットを指定します。
- すべてのシークレットを削除するには、次のコマンドを実行します。
gcloud beta run worker-pools deploy WORKER_POOL --image IMAGE_URL \ --clear-secrets
次のように置き換えます。
- WORKER_POOL: ワーカープールの名前。
IMAGE_URL: ワーカープールを含むコンテナ イメージへの参照(
us-docker.pkg.dev/cloudrun/container/worker-pool:latest
など)。削除するシークレットのリストを指定するには、
--remove-secrets
フラグを使用します。次のコマンドは、ボリュームとしてマウントされたシークレットと、環境変数として公開された別のシークレットを削除します。
gcloud beta run worker-pools deploy WORKER_POOL --image IMAGE_URL \ --remove-secrets=ENV_VAR_NAME,SECRET_FILE_PATH
次のように置き換えます。
- WORKER_POOL: ワーカープールの名前。
- IMAGE_URL: ワーカープールを含むコンテナ イメージへの参照(
us-docker.pkg.dev/cloudrun/container/worker-pool: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 でシークレットがボリュームとしてマウントされ、ボリューム マウント パスの最後のディレクトリがすでに存在する場合、既存のディレクトリ内のファイルまたはフォルダにアクセスできなくなります。
たとえば、my-secret
という名前のシークレットがパス /etc/app_data
にマウントされている場合、app_data
ディレクトリ内のすべてのコンテンツが上書きされ、表示されるファイルは /etc/app_data/my-secret
のみになります。
既存のディレクトリ内のファイルを上書きしないようにするには、シークレットをマウントするディレクトリ(/etc/app_data/secrets
など)を新たに作成し、シークレットのマウントパスを /etc/app_data/secrets/my-secret
にします。