使用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.0pg版本≥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
相关产品推荐
相关产品推荐

