gcloud の configurations を切り替える

前回の記事では --project を毎回渡せという主張を展開していたけど切り替える話。
blog.pokutuna.com

gcloud コマンドには構成を管理するサブコマンド gcloud config configurations がある。管理するプロジェクトが多くない場合は、カレントプロジェクトを設定しつつ切り替える運用でもよいのではないでしょうか。

また、複数の Google アカウントを切り替える場合も configuration を作って切り替えるのがいい。カレントプロジェクトは設定しない派だけど、個人の @gmail.com と勤務先の Google Workspace のログイン状態を切り替えるのに使ってる。

ちなみに configurations を切り替えても ADC はそのままで、最後に gcloud auth application-default login した時点の認証情報から変わらないのが注意ポイント

gcloud config configurations

Cloud SDK 構成の管理 | Cloud SDK のドキュメント | Google Cloud

触ってみないと微妙に分かりづらいけど、Google アカウントやカレントプロジェクトなど一連の設定を 1 つのエントリとしてまるっと切り替えることができる。

"プロジェクトを切り替えることができる" と説明されていたりするけど、Google アカウントを含む一連の構成を切り替えると思っておかないと、 gcloud config set project でプロジェクトを切り替えたり、ログインし直したりしているとよく分からなくなる。

プロジェクトを切り替えるには、同じ Google アカウントでログインした複数の構成を作って、別々のカレントプロジェクトを設定しておいて、それらを切り替えるという感じ。

# configuration の一覧
$ gcloud config configurations list

# configuration を作る & 同時にその設定名がアクティブになる
$ gcloud config configurations create NAME

# configuration に設定する
$ gcloud init # 最初から
$ gcloud auth login --project=PROJECT_ID # ログインしてプロジェクト ID 設定する
$ gcloud config set project PROJECT_ID # プロジェクト ID だけ設定する
$ gcloud config set compute/region REGION # region
$ gcloud config set comute/zone ZONE # zone

# NAME の設定に切り替える
$ gcloud config configurations activate NAME

例のように、region や zone も保存しておけるので、Compute Engine などこれらの引数を要求するコマンドをよく使うなら、設定してあるとちょっと楽になる。

gcloud config に設定できるもの

先に挙げたものが config に設定できるものとしてメジャーだけど、他にもいろんな設定を保存できるし、configuration で切り替えられる。

例えば以下のように設定しておくと、Cloud Functions に新しい関数をデプロイする際に region を省略しても asia-northeast1 になる。

$ gcloud config set functions/region asia-northeast1

設定可能な項目はドキュメントにちゃんとまとまってある。

gcloud config | Google Cloud CLI Documentation

あるいは jsonyaml で出力してみると雰囲気が分かっておもしろい。

$ gcloud config configurations list --format=json

accessibility/screen_reader を true に設定すると gcloud の出力がスクリーンリーダーフレンドリーになったり、core/log_http すると gcloud の API リクエストとレスポンスが出力されたりして面白いですね。

fzf や peco で切り替える

よくあるやつ。fzf でも peco でも動くので読み替える。

gcloud-switch() {
  local selected=$(
    gcloud config configurations list --format='table[no-heading](is_active.yesno(yes="[x]",no="[_]"), name, properties.core.account, properties.core.project.yesno(no="(unset)"))' \
      | fzf --select-1 --query="$1" \
      | awk '{print $2}'
  )
  if [ -n "$selected" ]; then
    gcloud config configurations activate $selected
  fi
}

gcloud にはグローバルな `--format=NAME[ATTRIBUTES](PROJECTION) オプションがあって、単体で出力をかなり加工できる。他のツールと組み合わせるときに使うとかわいいですね。

gcloud topic formats | Google Cloud CLI Documentation
gcloud topic projections | Google Cloud CLI Documentation

あるいは direnv を使っている場合は CLOUDSDK_ACTIVE_CONFIG_NAME 環境変数で切り替えることもできる。チームで configuration 名をプロジェクト名にしてリポジトリに入れたりするのもよいかもしれません。

Cloud SDK 構成の管理 | Cloud SDK のドキュメント | Google Cloud