前回の記事では --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
あるいは json や yaml で出力してみると雰囲気が分かっておもしろい。
$ 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 名をプロジェクト名にしてリポジトリに入れたりするのもよいかもしれません。