You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform中google_project_iam与google_service_account_iam的差异及适用场景

GCP Terraform IAM资源差异与使用指南

一、google_project_iam 与 google_service_account_iam 的核心差异及适用场景

核心差异

  • 作用范围:
    • google_project_iam:针对整个GCP项目的IAM权限管理,控制身份对项目内所有资源的访问权限(比如创建虚拟机、操作Cloud Storage桶等)。
    • google_service_account_iam:针对**单个GCP服务账号(SA)**的权限管理,包括两个方向:一是控制哪些身份能使用/管理该SA;二是给该SA本身赋予访问其他资源的权限。

适用场景

  • google_project_iam:
    • 给团队成员分配项目级通用权限(比如项目编辑者、查看者角色)。
    • 给某个SA授予项目内所有资源的批量权限(比如允许SA读写项目下所有GCS桶)。
  • google_service_account_iam:
    • Workload Identity场景:绑定Kubernetes服务账号到GCP SA,允许K8s工作负载以GCP SA的身份访问GCP资源。
    • 精细化控制SA的使用权限(比如只允许特定用户/SA扮演目标SA)。
    • 给SA授予特定资源的权限(比如允许某SA仅访问指定的Cloud SQL实例)。

二、iam_policy、iam_binding、iam_member 的区别及场景案例

这三个是IAM资源下的子类型,核心区别在于对现有权限的影响方式:

  • iam_policy:完全替换资源的整个IAM策略,会清除所有原有绑定,风险极高。
  • iam_binding:针对单个角色,替换该角色下的所有成员,原有成员会被全部覆盖。
  • iam_member:针对单个角色增量添加单个成员,不会影响该角色下的其他现有成员,日常使用最安全。

1. google_project_iam 下的案例

iam_policy(谨慎使用)

适用于完全重置项目IAM策略的场景,比如项目初始化或彻底清理权限:

resource "google_project_iam_policy" "project_admin_policy" {
  project     = "my-gcp-project-id"
  policy_data = data "google_iam_policy" "project_admin_policy".policy_data
}

data "google_iam_policy" "project_admin_policy" {
  binding {
    role = "roles/owner"
    members = [
      "user:admin@example.com",
      "serviceAccount:admin-sa@my-gcp-project-id.iam.gserviceaccount.com",
    ]
  }
}

注意:执行后项目原有的所有IAM绑定会被清空,仅保留上述配置的成员。

iam_binding

适用于统一替换某一角色下所有成员的场景,比如更新项目查看者列表:

resource "google_project_iam_binding" "project_viewers" {
  project = "my-gcp-project-id"
  role    = "roles/viewer"

  members = [
    "user:alice@example.com",
    "user:bob@example.com",
  ]
}

执行后,项目中原有roles/viewer角色的成员会被替换为alice和bob。

iam_member(日常常用)

适用于给项目增量添加权限,不影响现有配置:

resource "google_project_iam_member" "add_editor" {
  project = "my-gcp-project-id"
  role    = "roles/editor"
  member  = "user:charlie@example.com"
}

该操作仅给charlie添加项目编辑者权限,原有编辑者不受影响。

2. google_service_account_iam 下的案例

iam_policy(谨慎使用)

适用于完全重置某SA的IAM策略,比如仅允许指定身份使用该SA:

resource "google_service_account_iam_policy" "sa_restrict_access" {
  service_account_id = "my-sa@my-gcp-project-id.iam.gserviceaccount.com"
  policy_data        = data "google_iam_policy" "sa_restrict_access".policy_data
}

data "google_iam_policy" "sa_restrict_access" {
  binding {
    role = "roles/iam.serviceAccountUser"
    members = [
      "user:admin@example.com",
      "serviceAccount:k8s-sa@my-gcp-project-id.iam.gserviceaccount.com",
    ]
  }
}

执行后该SA的所有原有IAM绑定会被清空,仅保留上述配置的成员。

iam_binding

适用于统一替换能使用某SA的身份列表,比如批量更新Workload Identity绑定:

resource "google_service_account_iam_binding" "sa_workload_identities" {
  service_account_id = "my-gcp-sa@my-gcp-project-id.iam.gserviceaccount.com"
  role               = "roles/iam.workloadIdentityUser"

  members = [
    "serviceAccount:my-gcp-project-id.svc.id.goog[my-k8s-ns/my-k8s-sa-1]",
    "serviceAccount:my-gcp-project-id.svc.id.goog[my-k8s-ns/my-k8s-sa-2]",
  ]
}

执行后,该SA的roles/iam.workloadIdentityUser角色下的原有成员会被替换为上述两个K8s SA。

iam_member(Workload Identity标准配置)

这是Workload Identity最常用的配置方式,增量添加单个K8s SA到GCP SA的绑定:

resource "google_service_account_iam_member" "workload_identity_binding" {
  service_account_id = "my-gcp-sa@my-gcp-project-id.iam.gserviceaccount.com"
  role               = "roles/iam.workloadIdentityUser"
  member             = "serviceAccount:my-gcp-project-id.svc.id.goog[my-k8s-ns/my-k8s-sa]"
}

该操作仅允许指定的K8s SA扮演目标GCP SA,不会影响该SA的其他权限设置。

内容的提问来源于stack exchange,提问作者Coding_Maeda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 02:58:22