在GitLab流水线中通过Terraform操作Google Cloud的认证问题
问题解决:GitLab流水线中Terraform使用GCP服务账号模拟身份
核心问题
已通过GitLab OIDC联合身份认证GCP,可通过gcloud config set auth/impersonate_service_account模拟指定服务账号,gcloud命令正常执行,但Terraform无法复用该身份:
- 直接设置
GOOGLE_APPLICATION_CREDENTIALS为OIDC配置文件时,因令牌路径错误报错:oauth2/google: unable to generate access token: Post "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/[MASKED]:generateAccessToken": oauth2/google/externalaccount: failed to open credential file "/tmp/oidc-token.txt" - Terraform默认使用的应用默认凭据(ADC)未加载模拟的服务账号身份
解决方案
方案1:复用gcloud的模拟身份生成ADC
利用已配置好的gcloud模拟身份,生成Terraform可识别的ADC文件:
# 基于当前gcloud模拟的服务账号生成应用默认凭据 gcloud auth application-default login --no-launch-browser --impersonate-service-account $GCLOUD_SERVICE_ACCOUNT # 验证凭据有效性(可选) gcloud auth application-default print-access-token
执行后,gcloud会自动将ADC写入默认路径/root/.config/gcloud/application_default_credentials.json,Terraform会自动读取该路径,无需额外设置GOOGLE_APPLICATION_CREDENTIALS。
也可手动指定生成路径:
gcloud auth application-default print-credentials > /tmp/adc.json export GOOGLE_APPLICATION_CREDENTIALS=/tmp/adc.json
方案2:Terraform Provider直接配置服务账号模拟
跳过ADC配置,直接在Terraform的Google Provider中指定模拟的服务账号,让Terraform直接调用IAM Credentials API获取令牌:
在infra目录的provider.tf中添加:
provider "google" { project = "你的GCP项目ID" impersonate_service_account = var.gcloud_service_account # 或直接使用环境变量:"${var.GCLOUD_SERVICE_ACCOUNT}" }
注意:需确保GitLab的OIDC联合身份主体(工作负载身份池中的身份)拥有
roles/iam.serviceAccountTokenCreator权限,允许其模拟目标服务账号。
修复OIDC配置文件错误(可选)
若坚持使用OIDC配置文件,需完成以下两步:
- 将GitLab的OIDC令牌写入配置文件指定路径:
echo "$CI_JOB_JWT_V2" > /tmp/oidc-token.txt
- 确认
$GCLOUD_CREDENTIAL_CONFIGURATION配置文件中的token_path字段指向/tmp/oidc-token.txt,且credential_source配置正确。
权限要求
- GitLab联合身份主体:需拥有
roles/iam.serviceAccountTokenCreator权限,用于模拟目标服务账号 - 目标服务账号
$GCLOUD_SERVICE_ACCOUNT:需拥有Terraform操作GCP资源的对应权限(如roles/compute.admin、roles/storage.admin等)
内容的提问来源于stack exchange,提问作者Galen Howlett
相关产品推荐
相关产品推荐

