GCP の Cloud IAM に登場する基本概念まとめ + AWS IAM との対応

AWS を使うことが多かった自分が GCP をさわったところ、Cloud IAM に登場する用語が AWS の IAM と違うことで非常に混乱しました。
そこで、過去に AWS の IAM[^1] や Kubernetes の RBAC[^2] についてまとめたのと同じように、GCP の Cloud IAM に登場する基本概念をまとめました。

[^1]: [AWS IAMの基本概念を概念モデルで整理した](https://qiita.com/os1ma/items/18bcdbacddb8fc7c752a)
[^2]: [概念モデル + AWS IAM との対比で Kubernetes の RBAC を理解する](https://qiita.com/os1ma/items/4a0cb049ddd90762bc84)

※ 基本を理解するための記事なので、厳密ではない表現をしている箇所があります
※ Cloud IAM 初心者のため、間違いがあるかもしれません。見つけた方はご指摘ください

# Cloud IAM に登場する基本概念の全体像

整理した概念の全体像は以下の通りです。

![GCP_Cloud_IAM_概念モデル (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216010/84eac3ec-19ad-89c3-151c-8fc47ba90ce1.png)

AWS と比べながら順に説明していきます。

# 各概念の説明

## メンバー

![GCP_Cloud_IAM_概念モデル (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216010/7ddcd6b5-e315-9a5e-ca9a-f4e6af8440d7.png)

GCP では IAM によって権限を付与できる対象を「メンバー」と言います。

「メンバー」には、

* Google アカウント
* サービスアカウント
* Google グループ
* Cloud Identity or G Suite Domain

の 4 つがあります。

AWS で IAM によって権限を付与できる対象には IAM User、IAM Group、IAM Role の 3 つがありますが、この 3 つをまとめたような概念が「メンバー」です。

なお、**AWS の IAM Role は、ざっくり言うと GCP のサービスアカウントに相当**します。

## 権限

![GCP_Cloud_IAM_概念モデル (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216010/ac822ba6-27ef-7bd1-f56f-a5e799533fd8.png)

Cloud IAM における「権限」は、「どのサービスのどのリソースのどの API が許可されるか」を表します。
例えば、compute.instance.create のようにして、compute サービスの instance の作成 API の許可を表します。

**AWS の IAM では権限を記述するときに「xxx という ID のインスタンス」といったレベルまで指定できますが、Cloud IAM の「権限」ではそこまで制御できません。インスタンス名などを指定して権限制御したい場合は、以下のいずれかの方法で実現します。**

* **「バインディング」の中で「条件」を指定する**
* **特定の GCE インスタンスなどのリソースの「ポリシー」として権限を付与する**

これらの方法については後述します。

## ロール

![GCP_Cloud_IAM_概念モデル (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216010/5a81890d-ef80-9226-878f-6d0f1fd2edc3.png)

「権限」をまとめたものを「ロール」と言います。
例えば、xxx という「ロール」には、「GCE インスタンスの作成」と「GCE インスタンスの削除」を許可するといったイメージです。

非常に紛らわしいのですが、**Cloud IAM における「ロール」は AWS の IAM Policy に相当**します。

Cloud IAM の「ロール」には「基本ロール」、「事前定義ロール」、「カスタムロール」の 3 種類があります。
これらの概要と、AWS における用語のまとめは以下の通りです。

| GCP | AWS | 概要 |
| --- | --- | --- |
| 基本ロール | - | GCP で従来から使用されているオーナー、編集者、閲覧者の 3 ロールのこと |
| 事前定義ロール | AWS 管理ポリシー | GCP や　AWS が提供する、既存のロール (またはポリシー) |
| カスタムロール | カスタマー管理ポリシー | GCP や AWS のユーザが独自に作成するロール (またはポリシー) |

## バインディング

![GCP_Cloud_IAM_概念モデル (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216010/c358a6b9-767d-5c1b-f231-5dbbe2f51564.png)

「メンバー」と「ロール」の紐付けを「バインディング」と言います。

AWS には「バインディング」に相当する用語はなかったと思いますが、強いて言えば、Terraform を使うと登場する IAM Role Policy Attachment のようなリソースが「バインディング」に相当します。

「バインディング」には「条件」を定義することができます。
[公式ドキュメント](https://cloud.google.com/iam/docs/conditions-overview?hl=ja) によると、

> 条件の属性は、要求されたリソース（タイプや名前など）、または要求に関する詳細（ターゲットの Compute Engine や仮想マシン（VM）インスタンスのタイムスタンプ、発信元 IP アドレス、宛先 IP アドレスなど）に基づいています。これらの属性を使用した式の例を以下に示します。

ということで、**AWS では IAM Policy の中で「xxx という ID のインスタンス」といったレベルまで指定するように、Cloud IAM では「バインディング」の「条件」の中でインスタンス名などを指定する**ことができます。

また、AWS では IP アドレスによる制限なども IAM Policy の中に Condition として記述することになるという違いもあります。

## ポリシー

![GCP_Cloud_IAM_概念モデル (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216010/589cc831-cb7e-7cab-f128-981505e96ada.png)

最後になりますが、「バインディング」をまとめたものを「ポリシー」と言います。
つまり、**「誰がどのロールを持つか」をまとめたものが「ポリシー」**です。
「ポリシー」を見ると、「誰がどのロールを持つか分かる」というイメージです。
**AWS の IAM Policy とは全く違う概念です。非常に紛らわしいのでご注意ください**。

「ポリシー」は、リソース (プロジェクト・フォルダを含む) に対して設定できます。

例えば、**プロジェクトレベルで「誰がどのロールを持つか」を設定**したり、**特定の GCE インスタンスに対して「誰がどのロールを持つか」を設定**したりできます。
AWS における S3 のバケットポリシーが他のリソースに対しても存在するようなイメージです。

# Cloud IAM と AWS IAM の対応まとめ

ここまでで基本概念を一通り説明したので、最後に Cloud IAM と AWS IAM の用語の対応をまとめます。

| GCP | AWS | 概要 |
| --- | --- | --- |
| メンバー | IAM User + IAM Group + IAM Role | IAM で権限を付与できる対象 |
| Google アカウント | IAM User | エンジニアなどのユーザ |
| サービスアカウント | IAM Role | 他のクラウドリソースにアクセスする擬似的なユーザ |
| ロール | IAM Policy | どのリソースに何をできるか |
| リソース | Resource | 仮想マシン、ストレージなど |
| verb | Action | どの API を叩くことができるか |
| バインディング | なし (Terraform の IAM Role Policy Attachment など) | 「誰が」「どのリソースに何をできるか」を紐づけたもの |
| ポリシー | (S3 のバケットポリシー) | 「誰が」「どのリソースに何をできるか」の紐付けをまとめたもの |

# おわりに

この記事では Cloud IAM の基本概念を整理しました。
GCP におけるアカウント管理や権限制御については、この記事で整理した内容に加えて「プロジェクト」や「請求アカウント」、「GCS バケットのアクセス制御」なども理解していく必要がありそうです。

# 参考

- [公式ドキュメント](https://cloud.google.com/iam/docs/overview?hl=ja)
- [hatakoya memo - GCP (IAM) - IAM ポリシー](https://memo.koya-it.com/cloud_serverless/gcp_iam.html#iam-%E3%83%9D%E3%83%AA%E3%82%B7%E3%83%BC)