【正解】D
【0からの解説】
①前提知識:Secret Manager は、パスワードや API キーなどの機密情報を「シークレット」として保存し、値を更新するたびに新しい「バージョン」を追加していくマネージド サービスです。Cloud Run からシークレットを使う方法は 2 つあります。
・環境変数として公開:値は
インスタンスの起動時に解決されます。そのため Google は、環境変数で使う場合は latest ではなく特定のバージョンに固定(pin)することを推奨しています。latest を指定しても、すでに起動しているインスタンスは古い値を持ち続け、インスタンスによって値がバラバラになる可能性があります。
・ボリュームとしてマウント:ファイルを読み取るたびに Cloud Run が Secret Manager から latest バージョンの値を取得するため、
シークレットのローテーションとの相性が良いと公式ドキュメントに明記されています。
②要件の整理:(a) パスワードを毎週ローテーションする、(b) 管理しやすい(再ビルド・再デプロイなどの手間を増やさない)方法にする、の 2 点です。
③正解の理由:Secret Manager にパスワードを保存し、latest バージョンをボリュームとしてマウントしておけば、毎週シークレットに新しいバージョンを追加するだけで、アプリケーションは次回ファイルを読み込んだ時点で新しいパスワードを取得できます。コンテナの再ビルドや再デプロイは不要で、パスワードがイメージに焼き込まれることもありません。
【誤りの選択肢】
A:パスワードを Dockerfile の環境変数としてイメージに焼き込むため、イメージを取得できる人なら誰でもパスワードを読めてしまい、セキュリティ上不適切です。さらに毎週のビルド・デプロイ・トラフィック移行が必要で、「管理しやすい」という要件にも反します。
B:Secret Manager を使う点は正しいですが、環境変数の値はインスタンス起動時にしか解決されません。新しいバージョンを追加しても実行中のインスタンスには反映されず、新しいリビジョンのデプロイや再起動が必要になるため、ローテーションを確実に反映させる仕組みとしては D に劣ります。Google も環境変数ではバージョン固定を推奨しています。
C:ビルドフェーズでシークレットを渡しても、その値がイメージに取り込まれる形になり、毎週のビルドと再デプロイも必要です。ビルド時シークレットは本来ビルド処理(プライベート リポジトリへのアクセスなど)に使うもので、実行時の資格情報のローテーション手段としては不適切です。
【参考】
サービスのシークレットを構成する | Cloud RunSecret Manager でローテーション スケジュールを作成する