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

Cloud Run无法找到默认凭据:Gin服务连接Cloud Spanner问题求助

解决Cloud Run上PGAdapter连接Spanner的"Cannot find default credentials"问题

核心原因

Cloud Run环境下不需要手动设置GOOGLE_APPLICATION_CREDENTIALS环境变量,它会通过元数据服务器自动获取默认服务账号的凭据。你的问题出在代码中StartPGAdapterWithCredentials函数的调用方式没有适配Cloud Run的默认凭据机制。

具体解决步骤

1. 确认Cloud Run服务账号的Spanner权限

  • 打开Cloud Run控制台,找到你的Gin服务,进入「安全性」标签页查看关联的服务账号(默认是[你的项目ID]-compute@developer.gserviceaccount.com)
  • 给该服务账号授予roles/spanner.databaseUser角色(若需要更高权限可选择roles/spanner.admin),权限作用范围设为你的Spanner实例和数据库
  • 验证权限:用gcloud命令查询服务账号的IAM绑定
    gcloud projects get-iam-policy 你的项目ID --filter="bindings.members:serviceAccount:你的服务账号邮箱" --format="value(bindings.role)"
    

2. 修改代码适配默认凭据链

本地开发时GOOGLE_APPLICATION_CREDENTIALS会被默认凭据链优先读取,而Cloud Run上会自动使用元数据服务器的凭据,修改代码如下:

import (
    "context"
    "log"
    "github.com/GoogleCloudPlatform/pgadapter"
    "golang.org/x/oauth2/google"
)

func main() {
    // 替换为你的Spanner实例ID和数据库ID
    instanceID := "你的实例ID"
    databaseID := "你的数据库ID"

    // 获取默认凭据,自动适配本地/Cloud Run环境
    creds, err := google.DefaultCredentials(context.Background(), "https://www.googleapis.com/auth/spanner.data")
    if err != nil {
        log.Fatalf("获取默认凭据失败: %v", err)
    }

    // 用获取到的凭据启动PGAdapter
    pgAdapter, err := pgadapter.StartPGAdapterWithCredentials(instanceID, databaseID, creds)
    if err != nil {
        log.Fatalf("启动PGAdapter失败: %v", err)
    }
    defer pgAdapter.Stop()

    // 后续启动Gin服务的逻辑...
}

3. 移除Cloud Run的GOOGLE_APPLICATION_CREDENTIALS设置

  • 不要在Cloud Run服务的环境变量中配置GOOGLE_APPLICATION_CREDENTIALS,这会干扰默认凭据的获取流程
  • 本地开发时仍可保留该环境变量,默认凭据链会自动优先读取它

额外排查点

  • 确保Cloud Run服务的「允许无身份验证访问」设置符合你的需求(若服务需要被外部访问)
  • 检查Spanner实例和数据库的区域是否与Cloud Run服务的区域一致,避免跨区域访问的权限或网络问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 01:25:27