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

如何让Terraform使用指定GCP服务账号而非运行所在GCE实例账号

问题描述

在Google Compute Engine(GCE)实例上运行Gitlab CI任务,通过Terraform部署应用时,已指定GOOGLE_APPLICATION_CREDENTIALS环境变量指向自定义服务账号,甚至在Terraform provider中显式设置credentials = file("service_account.json"),但Terraform始终使用GCE实例自带的服务账号,而非指定账号。使用环境为hashicorp/terraform:light镜像、4.63.0版本的hashicorp/google provider。

解决方法

Google Cloud Provider的凭证优先级中,GCE实例元数据服务提供的默认凭证优先级高于环境变量和显式配置的凭证,因此需要强制跳过默认凭证获取,以下是可行方案:

  • 方案一:在Terraform Provider配置中禁用默认凭证
    在provider块中添加use_default_credentials = false,强制使用指定的服务账号凭证:

    provider "google" {
      credentials             = file("${var.google_application_credentials}")
      use_default_credentials = false
      project                 = var.gcp_project
      region                  = var.gcp_region
    }
    

    此配置会阻止Terraform尝试从GCE实例元数据服务获取凭证,严格使用你指定文件中的服务账号。

  • 方案二:通过环境变量禁用GCE元数据凭证获取
    在Gitlab CI的任务配置中添加GOOGLE_AUTH_DISABLE_GCE_METADATA=true环境变量,让Google Provider跳过GCE元数据服务的凭证检测:

    terraform_deploy:
      image: hashicorp/terraform:light
      variables:
        GOOGLE_APPLICATION_CREDENTIALS: "/tmp/service_account.json"
        GOOGLE_AUTH_DISABLE_GCE_METADATA: "true"
      script:
        - echo "$SERVICE_ACCOUNT_JSON" > $GOOGLE_APPLICATION_CREDENTIALS
        - chmod 600 $GOOGLE_APPLICATION_CREDENTIALS
        - terraform init
        - terraform apply -auto-approve
    

    注:假设SERVICE_ACCOUNT_JSON是Gitlab CI中存储的服务账号密钥变量,需先将其写入指定路径的文件,并设置600权限(仅所有者可读),避免因权限过宽被Google SDK拒绝。

  • 方案三:验证服务账号文件的可用性与权限
    确保服务账号文件已正确传递到CI容器中,路径与GOOGLE_APPLICATION_CREDENTIALS完全一致,且文件权限设置为600,否则Google SDK可能会拒绝使用该凭证文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 05:05:12