GCP跨项目用Terraform创建GKE报Error 403存储权限错误问题咨询
问题排查与解决指南
执行Terraform init命令时触发报错:error 403: XXX.serviceaccount does not have storage.object.create access to google cloud storage objects., forbidden. storage: object doesn’t exist。
该报错90%以上是Terraform脚本硬编码了原NP-H项目的配置导致,剩余为跨项目服务账号权限配置问题,优先按以下步骤调整脚本:
一、脚本配置调整项
- 校验
provider "google"块配置
原适配NP-H的脚本大概率硬编码了NP-H项目的服务账号凭证,需要修改为NP-S项目的对应配置:- 移除硬编码的
credentials字段,本地调试可直接执行gcloud auth application-default login获取个人账号凭证调用资源 - 若必须用服务账号执行,将
credentials参数的值替换为NP-S项目对应服务账号的密钥文件路径,同时将project参数修改为NP-S的项目ID
示例配置:
provider "google" { project = "NP-S的项目ID" region = "你指定的区域" credentials = file("./np-s-service-account-key.json") } - 移除硬编码的
- 校验Terraform GCS后端配置
原脚本的backend "gcs"块绑定的是NP-H项目下的Terraform状态存储桶,NP-S的服务账号默认没有该桶的操作权限,推荐方案为NP-S项目单独创建状态存储桶,修改后端配置:terraform { backend "gcs" { bucket = "NP-S项目新建的状态桶名称" prefix = "terraform/state" project = "NP-S的项目ID" } } - 全局替换脚本中所有硬编码的NP-H项目ID、资源路径等固定配置,避免跨项目资源调用触发权限拒绝
二、权限问题排查(脚本调整后仍报错再执行)
你个人账号可正常操作GCS不代表Terraform调用的服务账号有对应权限,按以下步骤校验:
- 确认报错信息中的
XXX.serviceaccount属于NP-S项目,且在你指定的GCS桶上被授予至少roles/storage.objectAdmin权限,权限授予命令:gcloud storage buckets add-iam-policy-binding 你的GCS桶名 \ --member="serviceAccount:XXX.serviceaccount" \ --role="roles/storage.objectAdmin" - 确认NP-S项目已启用GCS、GKE相关API,未启用API也会触发类403报错,启用命令:
gcloud services enable storage-api.googleapis.com container.googleapis.com
内容的提问来源于stack exchange,提问作者Vikram
相关产品推荐
相关产品推荐

