【GCP】gcloudのADCを上書きせずに用途別に分ける方法

【GCP】gcloudのADCを上書きせずに用途別に分ける方法 GCP

gcloud auth application-default login を実行すると、Application Default Credentials(ADC)のファイルは毎回同じ場所に書かれ、前の認証情報は上書きされます。この記事では、環境変数 CLOUDSDK_CONFIG で gcloud の設定ディレクトリを切り替え、既定の ADC に触れずに用途別の ADC を作る手順をまとめます。特定の API だけに使うスコープ付きの認証情報や、自分で作った OAuth クライアントで発行した認証情報を、普段の開発用と分けて持てるようになります。前提は macOS / Linux 上の Google Cloud CLI(gcloud)と、ADC を読む Google のクライアントライブラリです。

ADC はどこに書かれるか

公式ドキュメントでは、ADC は次の順で認証情報を探します。

  1. 環境変数 GOOGLE_APPLICATION_CREDENTIALS が指すファイル
  2. gcloud auth application-default login で作られたファイル
  3. 実行環境に付いているサービスアカウント(メタデータサーバー)

2つ目のファイルの既定の場所は次のとおりです。

Linux / macOS: $HOME/.config/gcloud/application_default_credentials.json
Windows:       %APPDATA%\gcloud\application_default_credentials.json

gcloud auth application-default login のリファレンスには、以前にこのコマンドで作った認証情報は上書きされると書かれています。スコープを変えて login し直すと、普段の開発で使っていた ADC も置き換わります。

CLOUDSDK_CONFIG で設定ディレクトリを切り替える

gcloud の設定ディレクトリは、環境変数 CLOUDSDK_CONFIG で変えられます。ADC のファイルもこの設定ディレクトリの中に置かれるため、CLOUDSDK_CONFIG を付けて login すれば、別のディレクトリに ADC ができます。

クライアントライブラリ側も同じ変数を見ます。たとえば Python の google-auth は、CLOUDSDK_CONFIG が設定されていればそのディレクトリを gcloud の設定ディレクトリとして扱い、その下の application_default_credentials.json を ADC のファイルにします。

今どの設定ディレクトリが使われているかは、次のコマンドで確かめられます。

gcloud info --format='value(config.paths.global_config_dir)'
/Users/<ユーザー名>/.config/gcloud

CLOUDSDK_CONFIG を付けると、出力が指定したディレクトリに変わります。

CLOUDSDK_CONFIG=$HOME/.config/gcloud-analytics gcloud info --format='value(config.paths.global_config_dir)'
/Users/<ユーザー名>/.config/gcloud-analytics

用途別の ADC を作る手順

ここでは例として、Google Analytics のデータを読むための読み取り専用の ADC を ~/.config/gcloud-analytics に作ります。ディレクトリ名とスコープは用途に合わせて置き換えてください。

1. 設定ディレクトリを決める

既定の ~/.config/gcloud とは別の名前にします。gcloud は設定ディレクトリに書き込むので、書き込める場所を選びます。

mkdir -p $HOME/.config/gcloud-analytics

2. 自分の OAuth クライアントを使う場合は JSON を置く

自分で作った OAuth クライアント(種類は「デスクトップ アプリ」)で認証したいときは、Cloud Console の「認証情報」からクライアントの JSON をダウンロードし、設定ディレクトリに置きます。この JSON は git などに入れないでください。

mv ~/Downloads/client_secret_*.json $HOME/.config/gcloud-analytics/client_secret.json

gcloud 既定のクライアントで足りる場合は、この手順は飛ばして構いません。

3. CLOUDSDK_CONFIG を付けて login する

--scopes で必要なスコープを指定します。--scopes を省いたときの既定は openid・userinfo.email・cloud-platform で、指定するとその一覧に置き換わります。

CLOUDSDK_CONFIG=$HOME/.config/gcloud-analytics \
  gcloud auth application-default login \
  --scopes=https://www.googleapis.com/auth/analytics.readonly,https://www.googleapis.com/auth/cloud-platform \
  --client-id-file=$HOME/.config/gcloud-analytics/client_secret.json

ブラウザが開くので、使いたい Google アカウントでログインします。終わると次のファイルができます。

$HOME/.config/gcloud-analytics/application_default_credentials.json

4. 必要なら quota project を設定する

--client-id-file を付けて login したときは、quota project(API の課金と割り当てに使うプロジェクト)が ADC に書かれません。クライアントライブラリで quota project が要る API を呼ぶ場合は、同じ CLOUDSDK_CONFIG を付けて設定します。

CLOUDSDK_CONFIG=$HOME/.config/gcloud-analytics \
  gcloud auth application-default set-quota-project <プロジェクトID>

ログインしたアカウントが、そのプロジェクトで serviceusage.services.use の権限を持っている必要があります。

5. アプリケーションから使う

作った ADC をアプリケーションに読ませる方法は2つあります。

CLOUDSDK_CONFIG を付けて起動する方法:

CLOUDSDK_CONFIG=$HOME/.config/gcloud-analytics python my_script.py

GOOGLE_APPLICATION_CREDENTIALS でファイルを直接指す方法:

GOOGLE_APPLICATION_CREDENTIALS=$HOME/.config/gcloud-analytics/application_default_credentials.json python my_script.py

GOOGLE_APPLICATION_CREDENTIALS は ADC の探索順で最初に見られるので、設定ディレクトリの中身に関係なくこのファイルが使われます。設定ファイルに環境変数を書くツールでは、$HOME や ~ が展開されないことがあるため、絶対パスで書きます。

動作を確認する

用途別の ADC からアクセストークンが取れることを確かめます。

CLOUDSDK_CONFIG=$HOME/.config/gcloud-analytics \
  gcloud auth application-default print-access-token

エラーにならずにトークンの文字列が1行出れば、ADC は読めています。続けて、既定の ADC が上書きされていないことを確かめます。

ls -l $HOME/.config/gcloud/application_default_credentials.json

更新日時が手順3より前のままなら、既定の ADC には触れていません。

トークンで API を直接呼んで、スコープとアカウントの組み合わせも確かめられます。Google Analytics Admin API の例です。

curl -s \
  -H "Authorization: Bearer $(CLOUDSDK_CONFIG=$HOME/.config/gcloud-analytics gcloud auth application-default print-access-token)" \
  -H "x-goog-user-project: <プロジェクトID>" \
  https://analyticsadmin.googleapis.com/v1beta/accountSummaries

アカウントとプロパティの一覧が返れば成功です。空の結果が返るときは、ログインした Google アカウントが目的のプロパティを持っていません。

うまくいかないとき

既定の ADC が書き換わってしまった

CLOUDSDK_CONFIG を付け忘れて login すると、既定の場所に書かれて前の認証情報が上書きされます。既定の ADC は、普段どおりの login をもう一度実行すれば作り直せます。

gcloud auth application-default login

シェルの履歴から再実行するときに付け忘れやすいので、用途別の login はエイリアスやスクリプトにしておくと防げます。

アプリケーションが別の ADC を読んでいる

GOOGLE_APPLICATION_CREDENTIALS がシェルの設定などで常に設定されていると、CLOUDSDK_CONFIG を切り替えてもそちらが優先されます。

echo $GOOGLE_APPLICATION_CREDENTIALS

何か出力された場合は、そのファイルが使われています。

quota project のエラーが出る

--client-id-file を付けて login した ADC には quota project が入っていません。手順4の set-quota-project を、同じ CLOUDSDK_CONFIG を付けて実行します。

用途別の ADC を消したい

gcloud auth application-default revoke は、login で作った認証情報を取り消し、ローカルのファイルを消します。CLOUDSDK_CONFIG を付けずに実行すると既定の ADC が対象になるので、消したい設定ディレクトリを指定して実行します。

CLOUDSDK_CONFIG=$HOME/.config/gcloud-analytics gcloud auth application-default revoke

参考

この記事を書いた人

渋谷で働くよわよわエンジニア。TypeScript(Next.js/Node.js)/Golang/AWS/Flutterなど
LINE API Expert(2023/1~)

tokkuをフォローする
オススメ記事
在宅ワークが多くなって、デスクの配線周りに困っている方は、拡張デスクの導入がおすすめです。Windows/MacOS/Linuxの複数の機器をスッキリとデスク周りに収める事ができました!リモートからサーバーメンテを行うインフラエンジニアは必見です!
GCP
シェアする
tokkuをフォローする

コメント

タイトルとURLをコピーしました