GCP 認証ガイド

gcloud CLI / Terraform / SDK の認証体系・適用順序・管理方法

全体像

gcloud CLI・Terraform・SDK は、どれも GCP にアクセスするために認証情報が必要。

それぞれのツールは「認証情報をどこから取るか」の探す順番が決まっている。ツールごとに多少違うが、探す順番の土台部分は共通で、この共通部分を ADC(Application Default Credentials)と呼ぶ。

gcloud コマンド
Terraform
SDK(プログラムから呼ぶ)
それぞれ固有の探し方がある(後述)
▼    ▼    ▼

ADC(どのツールも共通の探す順番)


Google Cloud の API
ADC とは?
認証情報を決まった順番で探す仕組みのこと(認証情報そのものではない)。
ADC が探した結果として見つかるもの(トークンやキーファイル)が、実際の認証情報になる。

ADC が認証情報を探す順番

ADC は上から順番に探して、見つかった時点でそれを使う。見つからなければ次へ進む。

1
環境変数 GOOGLE_APPLICATION_CREDENTIALS を確認
この環境変数に「認証ファイルの場所」が書いてあれば、そのファイルを使う。
設定例: export GOOGLE_APPLICATION_CREDENTIALS="/path/to/key.json"
設定されていなければ次へ
2
gcloud が作った認証ファイルを確認
gcloud auth application-default login を実行すると、認証ファイルが自動で作られる。
保存場所: ~/.config/gcloud/application_default_credentials.json(Mac/Linux)
ファイルがなければ次へ
3
Google Cloud のサーバー上なら自動で取得
GCE(仮想マシン)や Cloud Run の上で動いているプログラムなら、Google が自動で認証情報を渡してくれる。
設定は何もいらない。
どれも見つからなければ
!
エラー(認証できない)
ローカル開発では「2番」が使われることが多い。gcloud auth application-default login を実行すると認証ファイルが作られる。
ただしこのファイルは 1つしか持てないので、アカウントを切り替えるときは再実行して上書きする。

gcloud コマンドの認証 — 2種類ある(ここが一番ややこしい)

gcloud には2つの認証がある。よく混同されるので注意。

gcloud auth login

gcloud コマンド自体を使うための認証。

これを実行すると gcloud compute instances list のような gcloud コマンドが使えるようになる。

Terraform や SDK には影響しない。

gcloud auth application-default login

Terraform や SDK(プログラム)が使うための認証。

これを実行すると ADC 用の認証ファイルが作られ、Terraform や Python/Node.js のプログラムが GCP にアクセスできるようになる。

gcloud 以外のツールに影響する。

結論: ローカル開発では両方実行する。
gcloud auth login(gcloud コマンド用)と gcloud auth application-default login(Terraform / SDK 用)の2つ。

プロジェクトの切り替え方

GCP では複数のプロジェクト(開発用、本番用など)を使い分けることが多い。切り替え方法は4つあり、上にあるほど優先される

1
コマンドに直接書く
gcloud xxx --project=my-project のように、実行するときだけ一時的に指定する。
指定がなければ次を見る
2
環境変数で指定する
export CLOUDSDK_CORE_PROJECT=my-project でシェルセッション中ずっと有効。
環境変数もなければ次を見る
3
gcloud config で設定する
gcloud config set project my-project で永続的に設定する。
未設定なら次を見る
4
Named Configuration の設定を使う
プロジェクトごとに設定をまとめて保存しておき、切り替えて使う方法。

実務でよく使われるやり方: direnv で自動切り替え

direnv というツールを使うと、フォルダに入るだけでプロジェクトが自動で切り替わる。フォルダを出ると自動で元に戻る。

cd project-a/ → 自動で project-a に切り替わる
cd ../project-b/ → 自動で project-b に切り替わる
cd ~/ → 自動で設定が解除される

やり方: プロジェクトのフォルダに .envrc というファイルを作り、中に設定を書くだけ。

# project-a/.envrc
export CLOUDSDK_ACTIVE_CONFIG_NAME=project-a
export CLOUDSDK_CORE_PROJECT=my-project-a

Terraform の認証

Terraform も GCP を操作するときに認証が必要。Terraform は認証情報を以下の順番で探す。

1
Terraform の設定ファイルに直接書いてある認証情報
access_tokencredentials を provider ブロックに書く方法。
書いてなければ次へ
2
Terraform 用の環境変数
GOOGLE_OAUTH_ACCESS_TOKENGOOGLE_CREDENTIALSGOOGLE_APPLICATION_CREDENTIALS の順に確認する。
環境変数もなければ次へ
3
ADC を使う(gcloud で作った認証ファイル)
gcloud auth application-default login で作った認証ファイルが使われる。
ほとんどのローカル開発ではこれが使われる。
ローカルから Terraform を使うなら、やることはこれだけ:
gcloud auth application-default login を一度実行 → あとは普通に terraform apply するだけ。

もっと安全にやりたい場合: SA Impersonation

自分のアカウントで認証した上で、「Terraform 専用のサービスアカウント(SA)になりきって操作する」という方法。

これを使うと、秘密鍵ファイルを持ち歩かなくていいし、「誰が」「どの権限で」操作したかが記録に残る。

# 1. Terraform 用の SA になりきって ADC ログイン
gcloud auth application-default login \
  --impersonate-service-account terraform@my-project.iam.gserviceaccount.com

# 2. あとは普通に apply(SA の権限で実行される)
terraform apply

Terraform の State 保存先(GCS Backend)の認証

Terraform の状態ファイル(State)を Google Cloud Storage に保存する場合、Backend の認証は Provider とは別。ただし、ADC を使っていれば特別な設定は不要。

SDK(プログラムから GCP を使う場合)の認証

Node.js や Python のプログラムから GCP のサービス(Cloud Storage など)を呼ぶときも認証が必要。

1
プログラムの中で認証情報を直接指定している場合
コンストラクタに keyFilenamecredentials を渡している場合、それが使われる。
指定していなければ次へ
2
ADC を使う(gcloud で作った認証ファイル)
Terraform と同じ。gcloud auth application-default login で作った認証が使われる。
コードに何も書かないのが一番シンプルで推奨。

言語ごとの書き方

言語何も指定しない(推奨)明示的に指定する場合
Node.js new Storage() new Storage({ keyFilename: '...' })
Python storage.Client() Client.from_service_account_json('...')
Go storage.NewClient(ctx) option.WithCredentialsFile("...")
どの言語でも、引数なしでクライアントを作れば ADC が自動で認証してくれる。
ローカルでは gcloud auth application-default login、本番では自動認証が使われる。

場面ごとに何を使えばいいか

場面やること
ローカル開発 gcloud auth application-default login を実行するだけ 簡単
ローカル開発(より安全に) 上のコマンドに --impersonate-service-account=SA名 を追加 推奨
CI/CD(GitHub Actions 等) Workload Identity Federation を設定する(秘密鍵なしで認証できる仕組み) 設定が必要
本番サーバー(GCE / Cloud Run 等) 何もしなくていい。Google が自動で認証してくれる 自動
秘密鍵ファイル(JSON)を使う 環境変数 GOOGLE_APPLICATION_CREDENTIALS にパスを設定 非推奨

ローカル開発の初期セットアップ(やることリスト)

1
gcloud init
gcloud コマンドをインストールして初期設定する。
2
gcloud auth login
gcloud コマンドが使えるようにする。ブラウザが開くので Google アカウントでログイン。
3
gcloud auth application-default login
Terraform や SDK が使えるようにする。これも同様にブラウザでログイン。
完了
gcloud / Terraform / SDK すべてが使える状態になった。