如何跨项目将Firebase Cloud Functions连接至Cloud SQL实例?
跨项目Firebase Functions连Cloud SQL Postgres报ECONNREFUSED的解决办法
问题根源
跨项目访问Cloud SQL时,仅靠Unix套接字路径无法完成权限验证——项目B的Functions服务账号没有访问项目A中Cloud SQL实例的权限,同时Cloud SQL的权限配置也未对项目B开放。
解决步骤
1. 给项目B的Functions服务账号配置Cloud SQL权限
- 找到项目B中Cloud Functions使用的默认服务账号:格式通常是
PROJECT_ID@appspot.gserviceaccount.com(将PROJECT_ID替换为项目B的ID) - 进入项目A的Cloud SQL实例页面,打开IAM标签页
- 添加项目B的该服务账号,授予至少一个合适的角色:
Cloud SQL Client:仅允许连接实例(推荐生产环境使用)Cloud SQL Editor:允许连接并修改实例配置(按需选择)Cloud SQL Admin:最高权限(不推荐生产环境使用)
2. 配置私有网络连接(推荐生产环境)
如果使用VPC网络,需确保项目B的Functions与项目A的Cloud SQL实例网络互通:
- 给项目A的Cloud SQL实例开启私有IP,并关联到指定VPC网络
- 在项目B中配置VPC对等连接,打通与项目A VPC的网络
- 部署项目B的Functions时,指定使用与对等连接关联的VPC网络和子网
3. 核对Unix套接字路径正确性
确保项目B的连接代码中,套接字路径与项目A的实例完全一致:
// Node.js连接示例 const { Pool } = require('pg'); const pool = new Pool({ user: '你的数据库用户名', password: '你的数据库密码', database: '你的数据库名', host: '/cloudsql/project-a:region:instance-name' // 路径必须与项目A实例完全匹配 });
4. 检查Functions的部署配置
- 部署项目B的Functions时,必须在
firebase.json中添加Cloud SQL实例配置,让平台自动挂载套接字:
{ "functions": { "cloudSqlInstances": "project-a:region:instance-name", // 必填配置 "vpcConnector": "你的VPC连接器名称", // 使用VPC连接时添加 "runtimeOptions": { "memory": "256MB" } } }
- 执行
firebase deploy --only functions重新部署,确保配置生效
5. 公网连接排查(不推荐生产环境)
如果非要使用公网IP连接,需在项目A的Cloud SQL实例连接标签页,将项目B Functions的出口IP添加到授权网络中——注意Functions出口IP是动态的,这种方式稳定性差,优先使用私有网络方案。
测试验证
重新部署项目B的Functions后,调用函数测试连接。若仍报错,查看Cloud Functions日志,确认是否有IAM权限不足的提示,再针对性调整权限配置。
内容的提问来源于stack exchange,提问作者cjpete
相关产品推荐
相关产品推荐

