使用Terraform设置IAM权限时如何避免丢失GCS存储桶访问权限
问题根因
你当前使用的google_storage_bucket_iam_policy属于权威IAM政策资源,会直接替换存储桶的全部现有权限配置,而非在原有基础上新增绑定,这就是你作为创建者丢失权限的直接原因。
避免锁死存储桶的可行方案
- 优先使用增量IAM资源替代权威政策
把现有配置里的google_storage_bucket_iam_policy替换为google_storage_bucket_iam_binding(针对特定角色批量绑定成员)或者google_storage_bucket_iam_member(针对单个成员绑定特定角色),这两类资源只会修改指定角色的绑定关系,不会覆盖全部权限,原有创建者、项目级预设权限都会保留。
示例配置参考:
# 仅新增storage.admin角色的绑定,不影响其他已有权限 resource "google_storage_bucket_iam_binding" "admin_binding" { bucket = var.bucket role = "roles/storage.admin" members = var.isProd ? [ "serviceAccount:terraform-exec@your-project.iam.gserviceaccount.com", # 提前添加紧急运维账号/组 "group:prod-sre@yourcompany.com", "user:your-admin-account@yourcompany.com" ] : [ # 测试环境成员列表 ] }
强制在权威政策中预留紧急权限白名单
如果你确实需要使用google_storage_bucket_iam_policy做全量权限管控,必须在IAM政策的绑定规则里提前写入不会被随意删除的固定管理员账号/组权限,比如公司级SRE管理员组、专属紧急运维账号,为其保留roles/owner或者roles/storage.admin权限,避免执行配置的服务账号删除后无账号可访问存储桶。你可以将这类固定管理员列表定义为Terraform变量的默认值,避免后续配置变更时被误删。配置项目/组织级预设IAM权限继承
你可以在项目层级给指定账号/组绑定roles/storage.admin或者更高的roles/owner权限,项目级绑定的权限会默认继承到该项目下所有存储桶资源,只要存储桶自身的IAM政策没有显式拒绝相关账号,项目级权限就会生效。如果你的谷歌云资源在组织架构下管理,还可以给组织级的管理员组绑定存储管理员权限,组织级权限会默认继承到所有项目、所有资源做兜底,就算桶级、项目级权限都被错误覆盖,组织管理员依然可以访问资源恢复配置。针对Terraform状态存储的额外防范
存储Terraform状态的GCS桶,不要用同一个Terraform配置管理它的IAM权限,避免配置写错直接锁死状态桶导致整个配置无法执行。可以单独手动配置或者用独立的Terraform配置管理状态桶的权限,且提前预留多个管理员权限。
内容的提问来源于stack exchange,提问作者spierce7

