我正在尝试在Google Cloud app Engine上托管一个实现为Node.js应用程序的API。API使用的数据库是一个PostgreSQL 9.6数据库,该数据库托管有一个Cloud SQL实例。数据库通过Knex
连接到Node.js API。
当托管在应用程序引擎上时,不需要与数据库进行任何联系的API端点工作正常。但是,当需要联系数据库以完成API调用时,日志中会出现以下错误:
未处理的拒绝超时错误:Knex:获取超时联系游泳池可能已经满了。你是不是错过了.交易(trx)调用?
但是,如果我使用Knex
本地连接到云SQL实例并通过localhost:3000寻址API,则需要数据库的API调用完全可以完成。这验证了云SQL上的PostgreSQL数据库实例工作正常,以及应用引擎上托管的Node.js应用程序导致与云SQL实例的连接失败。
我像这样连接到数据库:
module.exports = require('knex')({
client: 'pg',
debug: true,
connection: {
host : '35.194.32.254',
user : 'postgres',
password : 'mypassword',
database : 'mydatabase'
},
});
同样,本地连接成功,应用程序引擎连接失败。
我的app.yaml
文件如下:
runtime: nodejs
env: flex
beta_settings:
cloud_sql_instances: my-project-12345:us-central1:mydatabase
为了确保这不是权限问题,我授予应用引擎服务帐户my-project-12345@appspot.gserviceaccount.com
云SQL客户端权限。我还验证了Cloud SQL实例与app Engine上的Node.js应用程序部署在同一个区域。
我的问题是:如果应用引擎上的Node.js可以本地连接到云SQL实例,为什么它不能连接到它?
根据Vadim的评论,必须使用UNIX套接字从应用程序引擎连接到云SQL,否则必须涉及IP白名单,这方面几乎没有指南。
为了实现这一点,我们只需将host
从35.194.32.254
更改为UNIX套接字/cloudsql/my-project-12345:us-central1:mydatabase
:
module.exports = require('knex')({
client: 'pg',
debug: true,
connection: {
host : '/cloudsql/esp-mobile-182605:us-central1:esp-db', // 127.0.0.1 for local testing, 35.194.32.254 to locally use hosted db on Cloud SQL
user: 'postgres',
password: 'seniordesign',
database: 'esp_db'
},
});
-
遵循官方文档
https://cloud.google.com/sql/docs/postgres/connect-app-engine-standard -
从此处复制并粘贴
https://github.com/GoogleCloudPlatform/nodejs-docs-samples/blob/master/cloud-sql/postgres/knex/server.js -
不要在.env文件中设置DB_HOST(这是我的问题)