如何使用本地凭证从Node.js程序连接GCP Cloud SQL(无需IP白名单)
本地Node.js通过谷歌凭证访问Cloud SQL PostgreSQL方案
有两种可靠的方式实现本地通过谷歌凭证访问Cloud SQL,无需开放公网IP或手动维护IP白名单:
方式一:使用Cloud SQL Auth Proxy(推荐)
这是GCP官方推荐的安全方案,Proxy会自动处理认证和加密,无需修改原有数据库连接逻辑。
操作步骤
安装Cloud SQL Auth Proxy
下载对应系统的二进制文件:- macOS/Linux:
curl -o cloud-sql-proxy https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.1.0/cloud-sql-proxy.darwin.amd64(可替换为对应版本和架构) - Windows:直接下载对应exe文件
赋予执行权限(macOS/Linux):chmod +x cloud-sql-proxy
- macOS/Linux:
配置本地凭证
- 个人账号场景:运行
gcloud auth application-default login,按提示完成登录,自动生成默认应用凭证。 - 服务账号场景:下载服务账号密钥JSON文件,保存到本地指定路径。
- 个人账号场景:运行
启动Proxy
- 默认凭证启动:
./cloud-sql-proxy <你的项目ID>:<实例区域>:<实例ID> - 服务账号密钥启动:
./cloud-sql-proxy <你的项目ID>:<实例区域>:<实例ID> --credentials-file=/path/to/service-account-key.json
- 默认凭证启动:
Node.js连接数据库
Proxy会将本地端口(默认5432)转发到Cloud SQL实例,直接用本地连接参数即可:const { Client } = require('pg'); const client = new Client({ host: 'localhost', port: 5432, user: '<数据库用户名>', password: '<数据库密码>', database: '<数据库名称>' }); client.connect() .then(() => console.log('连接成功')) .catch(err => console.error('连接失败', err));
方式二:直接使用IAM认证(无需Proxy)
通过谷歌凭证生成临时密码,直接在PostgreSQL驱动中使用,适合不想运行额外进程的场景。
操作步骤
配置IAM权限
给你的谷歌账号或服务账号授予Cloud SQL Client角色,确保拥有访问Cloud SQL实例的权限;同时在Cloud SQL实例的IAM认证设置中启用该功能。安装依赖
npm install pg google-auth-library编写连接代码
利用google-auth-library生成临时访问令牌,作为密码连接数据库(用户名是你的谷歌邮箱或服务账号邮箱):const { Client } = require('pg'); const { GoogleAuth } = require('google-auth-library'); async function connectToCloudSQL() { const authClient = await new GoogleAuth({ scopes: ['https://www.googleapis.com/auth/cloud-platform'] }).getClient(); const token = await authClient.getAccessToken(); const pgClient = new Client({ host: '<Cloud SQL实例公网IP>', // 需实例保留公网IP,但无需添加IP白名单 port: 5432, user: '<你的谷歌邮箱/服务账号邮箱>', password: token.token, database: '<数据库名称>', ssl: { rejectUnauthorized: false } // 生产环境建议配置官方CA证书 }); try { await pgClient.connect(); console.log('连接成功'); // 执行查询逻辑 } catch (err) { console.error('连接失败', err); } finally { await pgClient.end(); } } connectToCloudSQL();
注意事项
- 临时令牌有效期为1小时,需在过期前重新生成。
- 生产环境中建议配置PostgreSQL的SSL证书,避免禁用
rejectUnauthorized。
内容的提问来源于stack exchange,提问作者AnandShiva
相关产品推荐
相关产品推荐

