「AWS IAMは使いこなしてるけど、GCPのIAMはなんだか馴染めない…」
そんなエンジニアのために、この記事では AWS IAMに精通している方がスムーズにGCP IAMを理解・活用するための視点で構成 しています。
- IAMの考え方の違い
 - ポリシーとロールの構造の比較
 - GCP IAMの三要素「誰に・何を・どこで」
 - サービスアカウントや条件付きポリシーの使い所
 - 実例ベースの比較コード付き
 
🧭 全体構成マップ
AWS IAM ユーザー/グループ/ロール + ポリシー
GCP IAM プリンシパル + ロール + リソース(組織/フォルダ/プロジェクト)
AWS IAM                    GCP IAM
───────────────           ──────────────────────────
IAMユーザー                プリンシパル(user: / serviceAccount:)
IAMロール                  サービスアカウント / Impersonation
IAMグループ                G Suite グループ(Google Groups)
ポリシー(JSON)          ロール(Primitive / Predefined / Custom)
                           + IAMポリシーバインディング
🏗️ 基本概念の違いと読み替えマッピング
| 概念 | AWS IAM | GCP IAM | 備考 | 
|---|---|---|---|
| ポリシー | JSONで記述 | ロールにまとめられている | GCPは単体のポリシードキュメントが無い | 
| ロール | IAMロールとアクセス許可のセット | ロール=権限セット | GCPロールは3タイプ | 
| リソース階層 | 単一アカウント | 組織 → フォルダ → プロジェクト | 継承ベースでアクセス管理 | 
| 条件付き権限 | "Condition": {...} | 
条件付きIAM | GCPは強力な条件式サポート | 
| クロスアクセス | AssumeRole + TrustPolicy | サービスアカウントのImpersonation | GCPの方が細かく柔軟 | 
🧪 具体例で理解する:Cloud Storage(GCS) vs S3
✅ AWSでのS3の読み取り権限付与
{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Action": ["s3:GetObject"],
    "Resource": "arn:aws:s3:::my-bucket/*"
  }]
}
→ IAMユーザーまたはIAMロールにアタッチ。
✅ GCPでのGCS読み取り権限付与(gcloud CLI)
gcloud projects add-iam-policy-binding my-project \
  --member="user:alice@example.com" \
  --role="roles/storage.objectViewer"
🔍 ポイント:
- 
member: IAMプリンシパル(ユーザー、サービスアカウントなど) - 
role: 権限をまとめたロール - 
リソース: ここではプロジェクトスコープ(Storageはその下に紐づく) 
🧠 GCP IAMの三要素モデル("Who", "What", "Where")
| 要素 | 内容 | 例 | 
|---|---|---|
| Who(誰に) | Member(ユーザー/サービスアカウント) | user:alice@example.com | 
| What(何を) | Role(権限のセット) | roles/compute.instanceAdmin | 
| Where(どこで) | Resource(組織/フォルダ/プロジェクト) | projects/my-project-id | 
🔒 IAM Conditions(条件付きアクセス)の強力さ
GCPはアクセス時点の属性に応じて許可条件を記述可能です。
⏰ 例:アクセス期限を設ける
--condition="expression=request.time < timestamp('2025-12-31T23:59:59Z'), title=expire2025, description=期限付き"
AWSにも Condition はありますが、GCPの条件式は [Common Expression Language (CEL)] をベースに柔軟です。
🤖 サービスアカウントと「なりすまし」権限(Impersonation)
✅ 例:Cloud Run → BigQuery 読み取り
# BigQuery読み取りロールをサービスアカウントに付与
gcloud projects add-iam-policy-binding my-project \
  --member="serviceAccount:cloud-run-sa@project.iam.gserviceaccount.com" \
  --role="roles/bigquery.dataViewer"
✅ Impersonationを許可するロール
# あるユーザーにサービスアカウントの "なりすまし" を許可
gcloud iam service-accounts add-iam-policy-binding cloud-run-sa@project.iam.gserviceaccount.com \
  --member="user:devops@example.com" \
  --role="roles/iam.serviceAccountTokenCreator"
🔧 カスタムロールの定義例(Terraform)
resource "google_project_iam_custom_role" "custom_read_logs" {
  role_id     = "customReadLogs"
  title       = "Read Logs Only"
  description = "Allow only read access to logs"
  permissions = [
    "logging.logEntries.list",
    "logging.logEntries.get"
  ]
  project     = var.project_id
}
→ roles/customReadLogs を割り当て可能に。
🎯 まとめ
✅ GCP IAMの特徴(AWSとの違い)
- 権限の継承(組織 → プロジェクト)により 管理スコープが広く柔軟
 - ロールベースの設計(プリミティブ、プリ定義、カスタム)
 - 条件付きポリシーや サービスアカウントの impersonation で粒度の高い制御が可能
 - GCPは“人”よりも“リソースを中心にしたアクセス管理”