如何让Terraform改用gcloud活跃账号而非服务账号执行命令
问题背景
执行gcloud auth list查询当前已认证账号信息,返回结果如下:
gcloud auth list Credentialed Accounts ACTIVE ACCOUNT * xxxx@xxxx.com To set the active account, run: $ gcloud config set account `ACCOUNT
返回结果显示当前活跃账号为个人用户xxxx@xxxx.com,该账号权限配置符合预期。但执行Terraform命令时,系统并未使用该活跃个人账号完成鉴权,反而默认使用服务账号发起资源访问请求,触发如下权限报错:
Error: Error loading state: Failed to open state file at
gs://dxxxxdefault.tfstate: googleapi: got HTTP response code 403 with
body:Accessreturn (<Code>AccessDenied</Code>)
denied.terraform-win@xxxx.iam.gserviceaccount.com
does not have storage.objects.get access to the Google Cloud Storage
object.
报错提示加载Terraform状态文件失败,无法打开gs://dxxxxdefault.tfstate路径下的状态文件,Google API返回403 AccessDenied响应,原因为服务账号terraform-win@xxxx.iam.gserviceaccount.com对该Google Cloud Storage对象无storage.objects.get访问权限。需要调整配置让Terraform改用gcloud设置的当前活跃个人账号执行相关操作。
根因说明
Google Terraform Provider加载凭证有固定优先级,高优先级配置存在时会直接覆盖gcloud的活跃账号配置,优先级从高到低为:
- Terraform Provider块中显式配置的
credentials、impersonate_service_account参数 - 系统环境变量中
GOOGLE_APPLICATION_CREDENTIALS、GOOGLE_CREDENTIALS、GOOGLE_IMPERSONATE_SERVICE_ACCOUNT等凭证相关变量 - gcloud生成的应用默认凭证(ADC)
- GCP环境元数据服务返回的资源绑定服务账号(仅在GCE、Cloud Shell、GKE等GCP托管环境中存在)
当前默认加载到指定服务账号,说明存在优先级高于gcloud活跃账号的凭证配置,按以下步骤排查清理即可切换到个人账号。
操作步骤
- 清理环境变量中的服务账号配置
执行以下命令查看当前终端所有Google相关环境变量:
如果输出结果中存在env | grep GOOGLEGOOGLE_APPLICATION_CREDENTIALS(指向服务账号密钥文件路径)、GOOGLE_CREDENTIALS(存储服务账号密钥内容)、GOOGLE_IMPERSONATE_SERVICE_ACCOUNT(配置服务账号模拟)相关变量,执行unset 变量名清除即可,例如:unset GOOGLE_APPLICATION_CREDENTIALS - 清理Terraform配置中的硬编码凭证
打开当前Terraform项目目录下所有.tf后缀的配置文件,搜索credentials、impersonate_service_account字段,以及报错中的服务账号地址terraform-win@xxxx.iam.gserviceaccount.com,删除对应硬编码的凭证路径、服务账号模拟配置项后保存。 - 生成个人账号的应用默认凭证
执行以下命令,将当前gcloud活跃的个人账号配置为应用默认凭证:
执行后按照终端提示,在浏览器中完成个人账号的授权登录即可。如果你的Terraform运行在GCE、Cloud Shell等GCP托管环境中,该步骤生成的个人凭证优先级高于元数据服务默认返回的服务账号,会直接覆盖生效。gcloud auth application-default login - 验证配置
回到Terraform项目目录执行terraform init,如果可以正常拉取gs://dxxxxdefault.tfstate状态文件,说明已经成功切换到个人账号鉴权。
内容的提问来源于stack exchange,提问作者Kitteh
相关产品推荐
相关产品推荐

