【问题标题】:Cloud SQL instance connection working locally, but not on App EngineCloud SQL 实例连接在本地工作,但不在 App Engine 上
【发布时间】:2018-03-26 18:21:15
【问题描述】:

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

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

未处理的拒绝 TimeoutError: Knex: Timeout getting a 联系。游泳池可能已经满了。你错过了一个 .transacting(trx) 调用?

但是,如果我使用Knex 在本地连接到 Cloud 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 Cloud SQL 客户端权限。我还验证了 Cloud SQL 实例与 App Engine 上的 Node.js 应用部署在同一区域。

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

【问题讨论】:

  • 请阅读本指南:cloud.google.com/appengine/docs/flexible/nodejs/…,您应该使用 UNIX 套接字 /cloudsql/... 来连接而不是 IP。如果您通过 IP 连接,那么您必须处理 IP 白名单。
  • 通过config.socketPath = /cloudsql/... 使用UNIX 套接字并删除IP 会产生错误Unhandled rejection Error: connect ECONNREFUSED 127.0.0.1:5432 和最终的nginx 502。这是为什么?
  • 原因是config.socketPath只用于MySQL。由于我使用的是PostgreSQL,所以我需要使用config.host
  • 同样的问题,我正在关注官方指南 (github.com/GoogleCloudPlatform/nodejs-docs-samples/blob/master/…)

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


【解决方案1】:

根据 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'
    },
});

【讨论】:

  • 我尝试以同样的方式连接到 google postgres。但它没有连接。你有什么主意吗。你能帮我吗。我的配置是这个 const client = new Client({ user: 'xxx', host: '/cloudsql/proj-name:us-central1:app-name', database: 'xxxxx', password: 'xxxxxx', port: 5432, //connectionString: process.env.DATABASE_URL, //ssl: true, }); client.connect();
【解决方案2】:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-26
    • 2023-03-15
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    相关资源
    最近更新 更多