Cloud SQL实例连接在本地工作,但不在App Engine上工作

时间:2017-10-14 22:10:32

标签: node.js google-app-engine google-cloud-platform google-cloud-sql knex.js

我正在尝试托管在Google Cloud App Engine上实现为Node.js应用的API。 API使用的数据库是PostgreSQL 9.6数据库,该数据库由Cloud SQL实例托管。数据库通过Knex连接到Node.js API。

在App Engine上托管时,不需要与数据库进行任何联系的API端点工作正常。但是,当需要联系数据库以完成API调用时,日志中会出现以下错误:

  

未处理拒绝TimeoutError:Knex:超时获取a   连接。游泳池可能已满。你错过了吗?   .transacting(trx)电话?

但是,如果我使用Knex在本地连接到Cloud SQL实例并通过localhost:3000寻址API,则需要数据库的API调用完全正常。这将验证Cloud SQL上的PostgreSQL数据库实例是否正常工作以及有关在App Engine上托管的Node.js应用程序的内容正在使与Cloud SQL实例的连接失败。

我像这样连接到数据库:

module.exports = require('knex')({
        client: 'pg',
        debug:  true,
        connection: {
          host : '35.194.32.254', 
          user : 'postgres',
          password : 'mypassword',
          database : 'mydatabase'
        },
      });

同样,本地连接成功,App Engine连接失败。

我的app.yaml文件如下:

runtime: nodejs
env: flex
beta_settings:
  cloud_sql_instances: my-project-12345:us-central1:mydatabase

为确保这不是权限问题,我授予App Engine服务帐户my-project-12345@appspot.gserviceaccount.com Cloud SQL Client权限。我还验证了Cloud SQL实例与App Engine上的Node.js应用程序部署在同一区域。

我的问题是:为什么App Engine上的Node.js可以连接到Cloud SQL实例,如果它可以在本地连接到它?

2 个答案:

答案 0 :(得分:4)

根据Vadim的评论,必须使用UNIX套接字从App Engine连接到Cloud 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'
    },
});

答案 1 :(得分:0)