feat(gcp): 設定ディレクトリをグループ単位にし GCP_AUTH_MODE を新設する (PLAN39 PR3) - #125
Merged
Merged
Conversation
gcloud / gws の設定ディレクトリをグループボリューム配下へ向け、ユーザー OAuth が コンテナを作り直しても保たれ、かつグループをまたいで共有されないようにする。 あわせてサービスアカウント鍵に依存しない ADC を既定の経路にする。 - `CLOUDSDK_CONFIG=/persistent/group/gcloud` / `GOOGLE_WORKSPACE_CLI_CONFIG_DIR=/persistent/group/gws` を**ホスト側の生成 compose で渡す**。entrypoint の export は PID 1 の子孫にしか効かず、 docker exec のシェルには届かない (実機で確認)。entrypoint は空の named volume が root 所有で作られる件に対応してディレクトリを用意するだけにする - `GCP_AUTH_MODE` (`adc` / `key` / 未設定=auto) を新設。`adc` では鍵を書かず、 GOOGLE_APPLICATION_CREDENTIALS と BIGQUERY_KEY_FILE を **compose の列挙から外す**。 値だけ残して実体が無いと ADC はユーザー認証へフォールバックせず DefaultCredentialsError で落ちるため、空文字ではなく「渡さない」を選ぶ - `devbase env init` は鍵を登録したときだけ上記 2 変数を書く (従来は無条件) - `@googleworkspace/cli` をベースイメージへ追加。gws はどのコンテナにも入っておらず、 設定だけ永続化しても復旧しないため - ドキュメント: `GCP_AUTH_MODE` の使い分けと、`~/.config/gcloud` が gcloud の 設定ディレクトリではなくなったこと、並行実行の制約 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01S5oA2PqY6UX2Ca3t78886t
takemi-ohama
commented
Aug 29, 2026
takemi-ohama
left a comment
Contributor
Author
There was a problem hiding this comment.
🤖 cross-review | round 1 | codex | REQUEST_CHANGES
ADC モードでは、Compose に明示されたキー用パスも生成結果から除去してください。
takemi-ohama
commented
Aug 29, 2026
takemi-ohama
left a comment
Contributor
Author
There was a problem hiding this comment.
🤖 cross-review | round 1 | gemini | REQUEST_CHANGES
PLAN39 の GCP 認証モードの対応において、ホスト側(Python)とコンテナ側(entrypoint.sh)で鍵の有無の判定・フォールバック条件に乖離があり、docker exec 用の環境変数と実際のコンテナ状態に不整合が生じるリスクが見つかりました。
該当箇所にインラインコメントを残していますので、ロジックを両者で揃えるよう修正をお願いします。
cross-review round 1 の 2 件に対応する。どちらも「ホスト側は鍵モードのつもりで 2 変数を渡すのに、コンテナ側には鍵の実体が無い」という同じ壊れ方を招く。 - 元の compose.yml の `environment:` に `GOOGLE_APPLICATION_CREDENTIALS` / `BIGQUERY_KEY_FILE` が直書きされていると、機密の列挙を絞るだけでは生成 compose に残る。adc では鍵をどのサービスにも書かないので、`_drop_env_names` で全 サービスから名前ごと取り除く (map / list 両記法。空になれば environment ごと削除) - 鍵の有無の判定を entrypoint と揃える。`GCP_ACTIVE_PROFILE` (未設定なら default) のプロファイル 1 本だけを見て、無ければ後方互換の GOOGLE_APPLICATION_CREDENTIALS_BASE64 を見る。全プロファイル走査 (any) だと 別プロファイルの鍵だけでホストが key と判定してしまう - `GCP_AUTH_MODE=key` 宣言でもアクティブな鍵が無ければ adc へ倒す (警告付き)。 entrypoint が同じフォールバックを持つため、ホストだけ key だと実体の無い パスが docker exec のシェルへ残り DefaultCredentialsError になる Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01S5oA2PqY6UX2Ca3t78886t
Contributor
Author
🔧 /ndf:fix サマリ (round 1)対応件数: critical=0 / major=2 / minor=0 (合計 2 件) 詳細
どちらも「ホスト側は鍵モードのつもりで 2 変数を渡すのに、コンテナ側には鍵の実体が無い」という同じ壊れ方( 変更ファイル
品質チェック
|
takemi-ohama
commented
Aug 29, 2026
takemi-ohama
left a comment
Contributor
Author
There was a problem hiding this comment.
🤖 cross-review | round 2 | gemini | APPROVE
指摘事項が解消されていることを確認しました。追加の修正提案はありません。
takemi-ohama
commented
Aug 29, 2026
takemi-ohama
left a comment
Contributor
Author
There was a problem hiding this comment.
🤖 cross-review | round 2 | codex | APPROVE
修正が必要な指摘はありません。
This was referenced Aug 29, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Pull Request
概要
PLAN39 の 3 本目。問題 1「
gcloud auth loginがコンテナ再作成で消える」の本体です。gcloud / gws の設定ディレクトリをグループボリューム配下へ向け、ユーザー OAuth が
コンテナを作り直しても保たれ、かつグループをまたいで共有されないようにします。
あわせてサービスアカウント鍵に依存しない ADC を既定の経路にできるようにします。
設計判断は
issues/PLAN39_account-group-volume-separation.md(モード:architecture)に。関連 Issue
実装上の要点(プランからの変更 1 点)
プランは「entrypoint で
export CLOUDSDK_CONFIG=...する」と書いていましたが、それでは
docker execのシェルに届きません。コンテナの環境変数はホスト側の生成 compose が決めるもので、entrypoint の
export/unsetは PID 1 の子孫にしか効きません。実機で確認しました。
そこで ホスト側(
lib/devbase/env/gcp_auth.py)で決めて compose のenvironment:に載せる形にしました。entrypoint はディレクトリを用意するだけです。AC12 の「コンテナ内で 2 変数が
未設定であること」はこの経路でしか満たせません。
変更点
lib/devbase/env/gcp_auth.py(新規)resolve_auth_mode(env)GCP_AUTH_MODEがadc/keyならその値。未設定・空・未知の値なら auto 判定(鍵の env があればkey、無ければadc)container_env(env)CLOUDSDK_CONFIG/GOOGLE_WORKSPACE_CLI_CONFIG_DIR/ 解決済みGCP_AUTH_MODEfilter_key_env_names(names, mode)adcのときGOOGLE_APPLICATION_CREDENTIALS/BIGQUERY_KEY_FILEを列挙から外す未知の値を拒否せず auto へ倒すのは、タイプミスで既存プロジェクトが起動できなくなるのを
避けるためです。auto は現行
mainと同じ挙動になります。認証モード
adc(推奨)$CLOUDSDK_CONFIG/application_default_credentials.jsonに委ねるkeyGCP_CREDENTIALS_BASE64__<profile>を復号して書き、2 変数を渡すkey、無ければadcadcで 2 変数を「空にする」のではなく「渡さない」のが要点です。値だけ残して実体が無いとADC はユーザー認証へフォールバックせず
DefaultCredentialsErrorで落ちます(プラン 前提 10)。compose の
environment:に名前が載らなければ、Compose はその変数をコンテナへ渡しません。設定ディレクトリ
この 2 行で
credentials.db/access_tokens.db/legacy_credentials//configurations//application_default_credentials.jsonと gws のcredentials.enc/.encryption_keyがグループボリュームへ移ります。
CLOUDSDK_CONFIGは gcloud CLI 専用ではなくgoogle.authの探索経路そのものなので、BigQuery クライアント等も同じ場所を見ます。
containers/base/entrypoint.shdevbase_setup_cloud_config_dirs— 設定ディレクトリを用意する。空の named volume はroot 所有で作られ uid 1000 では書けないため、書けなければ
chownする(プラン 前提 18)devbase_setup_gcp_credentials— 認証モードに応じて鍵を書く / 書かない。ホストが古い場合やプロジェクト
env直書きに対する保険として、adcでは 2 変数をunsetもするcontainers/base/Dockerfilenpm グローバルへ
@googleworkspace/cliを追加しました。gws はこれまでどのコンテナにも入っておらず(稼働中の dev コンテナ 14 本すべてで
command -v gwsが空)、設定だけ永続化しても復旧しないためです(プラン 前提 17)。
lib/devbase/env/collectors/google.pydevbase env initは鍵を登録したときだけ 2 変数を書くようにしました。従来は鍵の有無に関係なく書いており、実体の無いパスが
envに残ると ADC がフォールバックできません。鍵の出力先について
~/.config/gcloud/credentials.json(既定)は変えていません。既存プロジェクトのenvがBIGQUERY_KEY_FILEにこのパスを書いているためです。ただしCLOUDSDK_CONFIGを向け直した後の~/.config/gcloudは gcloud の設定ディレクトリではなく単なる鍵の置き場になり、コンテナ層(揮発)に残ります。したがって鍵は毎起動
envから書き直され、永続領域には残りません(AC13)。プロファイルを切り替えても旧い鍵は存在しないので、
削除仕様そのものが不要になりました。
やらないこと(スコープ外)
devbase status表示・ボリューム構造のドキュメント — PR4docs/user/google-auth.md— PR5(本 PR のドキュメントからリンクしていますが、実体は PR5 で追加します。
release ブランチ内では PR5 の merge までリンク切れです)
満たす受け入れ条件
gwsがイメージに入る)adc/key/ 未設定を任意に切り替えられる。key→adcの戻り方向も含む影響と互換性
devbase build --no-cache)keyになり、現行と同じ挙動ですadcへ移すのは利用者の明示操作です同時に
gcloudを叩くとdatabase is lockedが出うります。恒久対策は取らず、再実行で回避する旨をドキュメントに書きました
動作確認
uv run pytestが greenbash -n containers/base/entrypoint.shが passdocker execに届かない」ことを実機で確認(上記コンソール)devbase build --no-cache後の実機確認(gcloud auth login→down→up→再認証なしで
gcloud auth list)は release PR でまとめて実施自動テスト
🤖 Generated with Claude Code
https://claude.ai/code/session_01S5oA2PqY6UX2Ca3t78886t