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

jsh*_*py8 4 google-app-engine node.js google-cloud-sql knex.js google-cloud-platform

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

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

未处理的拒绝 TimeoutError:Knex:获取连接超时。游泳池可能已经满了。您是否错过了 .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'
        },
      });
Run Code Online (Sandbox Code Playgroud)

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

我的app.yaml文件如下:

runtime: nodejs
env: flex
beta_settings:
  cloud_sql_instances: my-project-12345:us-central1:mydatabase
Run Code Online (Sandbox Code Playgroud)

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

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

jsh*_*py8 7

根据 Vadim 的评论,必须使用 UNIX 套接字从 App Engine 连接到 Cloud SQL,否则必须涉及 IP 白名单,关于如何做的指南很少。

为此,我们只需将hostfrom更改35.194.32.254为 UNIX socket /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'
    },
});
Run Code Online (Sandbox Code Playgroud)