GCP中cloud_sql_proxy报invalid_grant错误(权限齐全)如何调试?
问题场景
我们在GCP环境使用谷歌账号(非服务账号)连接Cloud SQL,无IP限制等特殊配置。我执行cloud_sql_proxy <project>:<region>:<database> -p 5435可正常连接,但同事执行相同命令时出现以下错误:
failed to connect to instance: failed to get instance: Refresh error: failed to get instance metadata (connection name = "<project>:<region>:<database>"): Get "https://sqladmin.googleapis.com/sql/v1beta4/projects/<project>/instances/<database>/connectSettings?alt=json&prettyPrint=false": auth: "invalid_grant" "Bad Request"
已完成的测试
- 同事账号已配置Cloud SQL Admin权限,拥有所有必要权限
- Cloud SQL Proxy已更新至最新版本
- 通过
gcloud auth list确认同事的GCP账号已认证、激活且为当前唯一账号 - 用
gcloud auth print-access-token获取令牌后,通过cloud_sql_proxy --token=...可正常连接,说明账号本身无问题,但Proxy默认未使用该账号 - 未设置GOOGLE_APPLICATION_CREDENTIALS环境变量
新增排查点
检查应用默认凭据状态
执行gcloud auth application-default print-access-token,如果返回错误或过期令牌,说明应用默认凭据未正确关联同事账号。执行gcloud auth application-default login重新生成凭据后,再尝试启动Proxy。验证凭据权限范围
执行gcloud auth list --format="value(scopes)",确认凭据是否包含https://www.googleapis.com/auth/sqlservice.admin或https://www.googleapis.com/auth/cloud-platform全范围权限。如果缺少,重新登录时指定范围:gcloud auth login --scope=https://www.googleapis.com/auth/sqlservice.admin,https://www.googleapis.com/auth/cloud-platform清除gcloud凭据缓存
手动删除gcloud的凭据缓存文件,重新生成凭据:- Linux/macOS:删除
~/.config/gcloud/credentials.db和~/.config/gcloud/application_default_credentials.json - Windows:删除
%APPDATA%\gcloud\credentials.db和%APPDATA%\gcloud\application_default_credentials.json
之后重新执行gcloud auth login和gcloud auth application-default login
- Linux/macOS:删除
排查环境变量冲突
执行env | grep GOOGLE和env | grep CLOUD,检查是否存在异常环境变量(如CLOUDSDK_AUTH_CREDENTIAL_FILE_OVERRIDE、GOOGLE_CLOUD_PROJECT等)干扰凭据加载。显式指定凭据文件启动Proxy
启动Proxy时直接指定应用默认凭据路径,验证是否是加载路径问题:cloud_sql_proxy --credential_file="$HOME/.config/gcloud/application_default_credentials.json" <project>:<region>:<database> -p 5435
如何获取更详细的Proxy日志
使用-verbose结合-log_debug参数,输出认证流程和API调用的细节日志:
cloud_sql_proxy -verbose -log_debug <project>:<region>:<database> -p 5435
Linux/macOS系统可将日志重定向到文件便于分析:
cloud_sql_proxy -verbose -log_debug <project>:<region>:<database> -p 5435 > proxy_debug.log 2>&1
重点关注日志中的凭据加载步骤和令牌刷新请求细节,确认是否加载了正确的凭据,以及刷新令牌时的请求响应内容。
内容的提问来源于stack exchange,提问作者schrom

