如何让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

