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

使用IAM认证连接Cloud Run Function与Cloud SQL遇密码错误,如何无密码连接?

解决Cloud Run通过IAM认证连接Cloud SQL时的SASL密码错误

错误原因

该错误是由于PostgreSQL客户端在SCRAM认证流程中未获取到有效的字符串类型密码。使用IAM认证连接Cloud SQL时,密码应为临时生成的IAM访问令牌,但可能因Connector配置、权限或依赖版本问题,导致令牌未正确生成或传递。

解决方案

1. 确保依赖版本兼容

使用以下兼容版本的依赖包,旧版本可能存在IAM认证处理bug:

  • @google-cloud/cloud-sql-connector 版本≥1.11.0
  • pg 版本≥8.7.0(支持SCRAM-SHA-256认证机制)

执行更新命令:

npm update @google-cloud/cloud-sql-connector pg

2. 验证服务账号权限

确认你的服务账号sample-service-account@developer满足以下条件:

  • 已被分配roles/cloudsql.client角色(允许连接Cloud SQL实例)
  • 目标Cloud SQL实例已开启IAM数据库认证(在控制台"连接" > "数据库认证"中启用)

3. 代码调整:强制保证密码为字符串类型

尽管Connector的getOptions方法应自动生成IAM令牌作为密码,但如果仍报错,可显式设置密码为空字符串(pg库会接受该值并使用Connector注入的令牌):

const connector = new Connector();
const clientOpts = await connector.getOptions({
  instanceConnectionName: "project:us-central1:instance",
  ipType: IpAddressTypes.PRIVATE,
  authType: AuthTypes.IAM,
})

const pool = new Pool({
  ...clientOpts,
  user: 'sample-service-account@developer',
  database: 'my-db',
  max: 1,
  password: clientOpts.password || '', // 确保密码为字符串类型,避免undefined引发错误
});

const {rows} = await pool.query('SELECT NOW()');
console.table(rows); 

await pool.end();
connector.close();

4. 检查私有IP网络配置

由于你使用私有IP连接,需确认:

  • Cloud Run服务与Cloud SQL实例处于同一VPC网络,或已通过VPC peering连通
  • Cloud Run服务已启用VPC访问(在控制台"网络"配置中开启)

额外排查步骤

  • 在创建连接池前添加console.log(clientOpts),查看返回结果中是否包含password字段。若为undefined,说明Connector未正确生成令牌,需重新检查服务账号权限或Connector版本。
  • 确认Cloud Run服务使用的是指定的服务账号(在控制台"安全" > "服务账号"中核对)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 18:13:21