gcloudのプロジェクトを素早く切り替える。
こんにちは、次世代システム研究室の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 [email protected] #リージョンを設定する $ gcloud config set compute/zone us-central1-a現在の設定は
gcloud config list
で表示できます。#出力例 macbook:~ username $ gcloud config list [compute] zone = us-central1-a [core] account = [email protected] 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 [email protected] alice-project us-central1-a同様に別のconfigurationsを設定します。
$ gcloud config configurations create bob-project $ gcloud config set project bob-project $ gcloud config set account [email protected] $ 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 = [email protected] 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 = [email protected] disable_usage_reporting = True project = bob-project Your active configuration is: [bob-project]
現在のプロジェクトをプロンプトに表示する
複数のプロジェクトが使えるようになると誤操作をしないか、が気になります。そこで誤操作を防ぐため、プロンプトにプロジェクトを表示します。現在アクティブなプロジェクトを表示するには、gcloud config list
やgcloud 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これで冒頭の画像のように動作します。
以上となります。作業効率向上の一助となれば幸いです。