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

Cloud SQL instance connection working locally, but not on App Engine

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

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

Unhandled rejection TimeoutError: Knex: Timeout acquiring a connection. The pool is probably full. Are you missing a .transacting(trx) call?

但是,如果我使用 Knex 在本地连接到云 SQL 实例并通过 localhost:3000 寻址 API,则 API 调用需要数据库完美完成。这验证了 Cloud SQL 上的 PostgreSQL 数据库实例工作正常,并且关于托管在 App Engine 上的 hte 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 云 SQL 客户端权限。我还验证了 Cloud SQL 实例与 App Engine 上的 Node.js 应用程序部署在同一区域。

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

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