本日も乙

ただの自己満足な備忘録。

GCEインスタンスとGKEノードのスコープをcloud-platformにすべき

休日なので軽めのネタを一つ。

GCE インスタンスや GKE ノードを作成するときに、デフォルトのサービスアカウント(Compute Engine default service account)を選択した場合にアクセススコープが3種類から選択できます。

  • デフォルトのアクセス権を許可
  • すべての Cloud API に完全アクセス権を許可
  • 各 API にアクセス権を設定

何も指定しないと[デフォルトのアクセス権を許可]が選択されているのでこれでいいのかなと思ってしまうのですが、[すべての Cloud API に完全アクセス権を許可]を選択することをオススメします。

GCE インスタンスのアクセススコープ画面

gce-scope

GKE ノードのアクセススコープ画面

gke-node-scope

gcloud コマンドから設定するには --scopes=https://www.googleapis.com/auth/cloud-platform を指定します。

$ gcloud compute instances create example-instance \
  ...(省略)...
  --service-account=example@developer.gserviceaccount.com \
  --scopes=https://www.googleapis.com/auth/cloud-platform 

ベストなのは、デフォルトのサービスアカウントではなくアプリケーションなどの単位でサービスアカウントを作成することです。カスタムで作成したサービスアカウントであれば https://www.googleapis.com/auth/cloud-platform がデフォルトで有効になります。

下は spinnaker-gcs-account というサービスアカウントで設定したときの図です。

GCE インスタンスの場合

gce-scope

GKE ノードの場合

gke-node-scope

Cloud IAM で権限を管理する

[すべての Cloud API に完全アクセス権を許可]は言葉とおりに受け止めるとすべての権限を許可してしまうので何やら不安になりますが、この設定によってスコープで権限を管理するのではなく、Cloud IAM で権限を管理できるようになります。

ドキュメントでは以下のように書かれています。

ベスト プラクティス これで Cloud IAM の役割を使用できるようになりました。すべての VM インスタンスに「有効なすべての Google Cloud API に対する完全アクセス権」スコープを設定することをおすすめします。
 
https://www.googleapis.com/auth/cloud-platform
 
VM インスタンスのサービス アカウントに特定の Cloud IAM の役割を付与して、特定の API へのアクセスを制限できます。詳しくは、サービス アカウント権限をご覧ください。

https://cloud.google.com/logging/docs/access-control?hl=ja#scopes

日本語では多少の表記ゆれはありますが、https://www.googleapis.com/auth/cloud-platform というスコープを設定するべきということに変わりません。

Cloud IAM で管理できるとうれしいこと

スコープ設定は古くからの名残りなのですが、スコープではなく Cloud IAM で管理できると何が嬉しいのでしょうか。

権限の変更がいつでもできる

スコープで設定してしまうと、権限を変更するときは一度 GCE インスタンスを停止する必要があります。稼働中のインスタンスを止めるのはなかなかハードルが高いです。Cloud IAM で管理できればサービスアカウントの権限を変更するだけなので、インスタンスやノードの停止・再作成は必要ありません。

複数のインスタンス・ノードに適用できる

スコープはインスタンス・ノード1つずつに紐付いているため、権限を変更したいときに複数あるとすべて変更しなければなりません。Cloud IAM であれば紐付いているサービスアカウントを変更すれば良いのでとても楽です。

細かい権限をつけられる

スコープの場合、有効か無効かしか設定することができません。例えば、GCS オブジェクトを取得だけしたい場合には対応できません。Cloud IAM であれば、Storage オブジェクト閲覧者(roles/storage.objectViewer)を付けることができます。

まとめ

GCE インスタンスと GKE ノードのスコープについて簡単に紹介しました。GCP に触れている人にとっては当たり前かもしれませんが、意外と知らない人も多い(私も昔ハマった)ので備忘として記事にした次第です。

参考文献