云SQL实例连接在本地工作,但在应用程序引擎上不工作



我正在尝试在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白名单,这方面几乎没有指南。

为了实现这一点,我们只需将host35.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(这是我的问题)

相关内容

  • 没有找到相关文章

最新更新