使用Terraform+GCP工作负载身份联盟创建GKE集群时遇ACCESS_TOKEN_SCOPE_INSUFFICIENT错误
排查GitLab CI + GCP工作负载身份联盟 + Terraform创建GKE的ACCESS_TOKEN_SCOPE_INSUFFICIENT错误
核心排查方向:Terraform使用的Token权限范围不匹配
虽然gcloud模拟服务账号能成功创建集群,但Terraform通过工作负载身份联盟获取令牌时,默认请求的权限范围往往和gcloud不一致,这是这类问题的核心原因。
1. 显式配置Terraform GCP Provider的权限范围
检查Terraform的GCP Provider配置,强制声明GKE创建所需的完整权限范围,避免默认范围不足:
provider "google" { project = var.gcp_project_id region = var.gcp_region zone = var.gcp_zone credentials = data.google_service_account_access_token.token.access_token # 显式指定覆盖默认值的权限范围 scopes = [ "https://www.googleapis.com/auth/cloud-platform", "https://www.googleapis.com/auth/compute", "https://www.googleapis.com/auth/container" ] } data "google_service_account_access_token" "token" { target_service_account = var.gcp_service_account_email scopes = ["https://www.googleapis.com/auth/cloud-platform"] lifetime = "3600s" }
2. 调整GitLab CI中获取令牌的命令
在CI脚本中,获取GCP访问令牌时显式指定所需范围,避免默认范围限制:
# 获取包含GKE权限的访问令牌 ACCESS_TOKEN=$(gcloud auth print-access-token --impersonate-service-account=${SERVICE_ACCOUNT_EMAIL} --scopes=https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/compute,https://www.googleapis.com/auth/container) export GOOGLE_OAUTH_ACCESS_TOKEN=${ACCESS_TOKEN}
让Terraform直接使用这个环境变量中的令牌,强制权限范围匹配需求。
3. 验证Terraform实际使用的令牌范围
在CI流程中添加调试步骤,解码令牌确认权限范围:
# 解码JWT令牌查看scope字段 echo ${GOOGLE_OAUTH_ACCESS_TOKEN} | cut -d. -f2 | base64 -d | jq '.scope'
如果输出不包含container.admin或相关GKE权限的范围,说明令牌范围确实不足,需要调整获取命令的--scopes参数。
4. 检查工作负载身份池的属性映射规则
确认GCP工作负载身份池的属性映射没有限制令牌范围:
- 检查映射规则是否正确传递GitLab CI_JOB_JWT的声明
- 确保没有添加限制scope的自定义规则,避免无意中缩小权限范围
5. 直接让Terraform模拟服务账号
如果以上步骤无效,尝试让Terraform直接模拟目标服务账号,绕开工作负载身份联盟的令牌获取流程,验证是否为范围问题:
provider "google" { project = var.gcp_project_id region = var.gcp_region zone = var.gcp_zone impersonate_service_account = var.gcp_service_account_email scopes = [ "https://www.googleapis.com/auth/cloud-platform", "https://www.googleapis.com/auth/compute", "https://www.googleapis.com/auth/container" ] }
此配置需要GitLab CI身份具备模拟该服务账号的权限,你已通过gcloud验证过权限,因此可用来快速定位问题。
内容的提问来源于stack exchange,提问作者Akasha
相关产品推荐
相关产品推荐

