2019.07.04

gcloudのプロジェクトを素早く切り替える。

Pocket


こんにちは、次世代システム研究室のN.O.です。

次世代システム研究室ではグループ内の様々なプロジェクトに参加しており、プロジェクトによって異なる契約の様々なSaaSやIaaSにアクセスする必要があります。今回は、GCP(Google Cloud Platform)における、gcloudコマンドで使用するプロジェクトを素早く切り替える手法をご紹介します。

環境
macOS X
direnv
Cloud SDK

GCPのプロジェクトについて

GCPのリソースはプロジェクトで管理されます。
プロジェクトのリソースにアクセスするには、Googleアカウントに対してIAMでアクセス権を付与する、IAMでサービスアカウントを発行し、サービスアカウントキーを作成し、これを利用してアクセスする、などの方法があります。ブラウザのコンソールでは、ページ上部のプルダウンメニューでプロジェクトを切り替えることができます。

Cloud SDKに付属するコマンドラインツールgcloudの場合、gcloud authで認証、またはサービスアカウントキーの場合はgcloud auth activate-service-account --key-file keyfile.jsonで認証後、gcloud config set project "プロジェクト名"でプロジェクトを指定することができます。プロジェクトを切り替えるごとにこのような作業をやるのは手間がかかり非効率ですが、configurationsという仕組みを使うことで、名前付きの設定集を作り、一括で管理することができます。
#configurationsを作成し、アクティブにする。
#以降の設定は作成したconfigurationsに紐づく
$ gcloud config configurations create alice-project #名前は任意に設定可能

#プロジェクトを設定する
$ gcloud config set project alice-project

#アカウントを設定する
$ gcloud config set account alice@example.com

#リージョンを設定する
$ gcloud config set compute/zone us-central1-a
現在の設定はgcloud config listで表示できます。
#出力例
macbook:~ username $ gcloud config list
[compute]
zone = us-central1-a
[core]
account = alice@example.com
disable_usage_reporting = True
project = alice-project

Your active configuration is: [alice-project]
また、gcloud config configurations listで、configurationsの一覧が確認できます。
#出力例
macbook:~ username $ gcloud config configurations list
NAME           IS_ACTIVE  ACCOUNT            PROJECT        DEFAULT_ZONE   DEFAULT_REGION
alice-project  True       alice@example.com  alice-project  us-central1-a
同様に別のconfigurationsを設定します。
$ gcloud config configurations create bob-project
$ gcloud config set project bob-project
$ gcloud config set account bob@example.com
$ gcloud config set compute/zone asia-east1-a
プロジェクトを切り替えるには、gcloud config configurations activateを使用します
#出力例
macbook:~ username $ gcloud config configurations activate alice-project
Activated [alice-project].
macbook:~ username $ gcloud config list
[compute]
zone = us-central1-a
[core]
account = alice@example.com
disable_usage_reporting = True
project = alice-project

Your active configuration is: [alice-project]

activateせずにプロジェクトを切り替える。

こうなってくるとactivateするのも億劫になりますが、CLOUDSDK_ACTIVE_CONFIG_NAMEという環境変数をセットすると、activateせずに切り替えることができます。
#出力例
macbook:~ username $ CLOUDSDK_ACTIVE_CONFIG_NAME=bob-project gcloud config list
[compute]
zone = asia-east1-a
[core]
account = bob@example.com
disable_usage_reporting = True
project = bob-project

Your active configuration is: [bob-project]

現在のプロジェクトをプロンプトに表示する

複数のプロジェクトが使えるようになると誤操作をしないか、が気になります。そこで誤操作を防ぐため、プロンプトにプロジェクトを表示します。現在アクティブなプロジェクトを表示するには、gcloud config listgcloud info --format='get(config.active_config_name)'といったコマンドが使えるのですが、ほんの少し待たされます。しかし環境変数であれば時間はかかならないので、前述のCLOUDSDK_ACTIVE_CONFIG_NAMEがセットされている時にプロンプトに表示するようにしてみます。

以下を~/.bash_profileなどに追記します。プロンプトが長くなるので改行を入れます。
# prompt for gcloud
PS1='\h:\W \u \[\e[1;36m\]`if [[ -n $CLOUDSDK_ACTIVE_CONFIG_NAME ]]; then echo gcp: ${CLOUDSDK_ACTIVE_CONFIG_NAME}; fi`\[\e[m\]\n$ '
# ここまで

ディレクトリの移動でプロジェクトも切り替える

ここでようやく本題です。direnvはディレクトリごとに自動的に環境変数をセットしてくれる便利なツールです。direnvはmacであればHomebrewでインストールできます。direnvを利用してディレクトリ移動とともにプロジェクトを切り替えるようにします。
$ mkdir alice-project
$ cd alice-project
$ echo export CLOUDSDK_ACTIVE_CONFIG_NAME=alice-project >> .envrc
$ direnv allow
$ cd ..

$ mkdir bob-project
$ cd bob-project
$ echo export CLOUDSDK_ACTIVE_CONFIG_NAME=bob-project >> .envrc
$ direnv allow
これで冒頭の画像のように動作します。

以上となります。作業効率向上の一助となれば幸いです。

最後に

次世代システム研究室では、アプリケーション開発や設計を行うアーキテクト、またはブロックチェーンのエンジニアを募集しています。次世代システム研究室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ 募集職種一覧 からご応募をお願いします。