如何允许 Google App Engine 访问 Google Cloud PostgreSQL

How to allow Google App Engine access Google Cloud PostgreSQL

我在 Google App Engine 中发现了我的 node.js 的问题,因为它无法连接到 Google Cloud PostgreSQL:

Unhandled rejection SequelizeBaseError: connect ETIMEDOUT ***.***.***.***:5432
at (/app/node_modules/sequelize/lib/dialects/postgres/connection-manager.js:111)
at Connection.<anonymous> (/app/node_modules/pg/lib/client.js:176)
at emitOne (events.js:96)
at Connection.emit (events.js:188)
at Socket.<anonymous> (/app/node_modules/pg/lib/connection.js:59)
at emitOne (events.js:96)
at Socket.emit (events.js:188)
at emitErrorNT (net.js:1281)
at _combinedTickCallback (internal/process/next_tick.js:74)
at process._tickCallback (next_tick.js:98)

我不确定如何在下面添加 IP 地址(也许我错过了在 Google Cloud SQL 中配置的内容)。

how to connect App Engine applications to Cloud SQL instances 上有一些非常好的文档。在那里,您可以找到有关如何让您的应用程序访问云 SQL 实例的详细步骤,适用于本地开发和生产环境中的每种受支持的编程和 SQL 语言。

假设您在将应用程序部署到生产环境(即 App Engine 环境)时发现了连接问题,这里有您必须执行的主要步骤的摘要:

  1. 使用命令 gcloud sql instances describe [INSTANCE_NAME] 获取您的 Cloud SQL 实例的全名。它应该是 <PROJECT_ID>:<REGION>:<INSTANCE_NAME>.
  2. 类型
  3. 使用与您的 App Engine 应用程序关联的服务帐户授予对 App Engine 的访问权限。它应该具有 Cloud SQL ClientCloud SQL Editor 角色。
  4. app.yaml 文件中为您的 SQL 实例定义 环境变量beta 设置

(将此代码添加到 app.yaml 文件中,根据您的参数进行编辑):

env_variables:
  SQL_USER: <YOUR_CLOUD_SQL_USER>
  SQL_PASSWORD: <YOUR_CLOUD_SQL_PASSWORD>
  SQL_DATABASE: <YOUR_CLOUD_SQL_DATABASE>
  INSTANCE_CONNECTION_NAME: <INSTANCE_CONNECTION_NAME>   # With format as <PROJECT_ID>:<REGION>:<INSTANCE_NAME>

beta_settings:
  cloud_sql_instances: <INSTANCE_CONNECTION_NAME>   # With same format
  1. 使用 package.json 文件将 Node.js PostreSQL 客户端库添加到您的应用程序。文档建议使用 Knex.jspg,但大概您可以使用您选择的一种。

(将此代码添加到 package.json 文件):

"dependencies": {
  "async": "2.5.0",
  "express": "4.15.4",
  "knex": "0.13.0",
  "pg": "7.3.0",
  "prompt": "1.0.0"
},

为您的应用程序设置正确的配置后,您可以查看此 sample Node.js code。为了在您的主脚本中找到任何丢失的项目。

如果您现在部署您的应用程序,它应该可以正常工作。

P.S.: 请记住,由于 App Engine 和 Cloud SQL 是 Google Cloud Platform 系列的两个产品,因此无需在其中授权外部网络你的 Cloud SQL 实例,所以你也可以忘记那部分。