首页 > 解决方案 > 无法从 App Engine 中的 Node JS 连接到 Cloud MySQL

问题描述

我有一个在本地运行的带有 MySQL 的 NodeJS 应用程序,但现在我已经将它部署在 APP Engine 中,我需要将它与 MySQL Google Cloud 连接,我已经创建了 MySQL 实例和数据库,但我无法连接我的应用程序(NodeJS在 App Engine 中)与我在 MySQL 云中的数据库,我使用以下代码:

const mysql = require('mysql');


var con = mysql.createConnection({
  host: "host-IP",
  socketPath: "/cloudsql/project:region:instance",
  user: "USERNAME",
  password: "USERPASSWORD"
});

con.connect(function(err) {
  if (err) throw err;
  console.log("Connected!");
});

module.exports = con;

档案 .YAML---------------

runtime: nodejs
env: flex
env_variables:
  SQL_USER: "USERNAME"
  SQL_PASSWORD: "USERPASSWORD"
  SQL_DATABASE: "DBNAME"
  INSTANCE_CONNECTION_NAME: "project:region:instance"
beta_settings:
  cloud_sql_instances: "project:region:instance"

请帮我。

标签: mysqlnode.jsgoogle-app-enginegoogle-cloud-platform

解决方案


从 App Engine Flexible 连接到 Cloud SQL 实例有两种选择。您可以通过实例的公共 IP 或私有 IP 进行连接。

我的建议是通过私有 IP 进行连接,因为通过私有 IP 的连接提供了更低的延迟和有限的攻击向量,因为它们不需要遍历互联网。

假设您已经有一个实例并通过公共 IP 连接,步骤如下:

  1. 在您的 Cloud SQL 实例中创建一个数据库一个用户。

  2. instance_connection_name为您的实例获取。可以通过实例Overview,gcloud sql instances describe [INSTANCE_NAME]命令找到。它有一个projectID:region:instanceName格式。

  3. 授予您的应用用于验证对 Cloud SQL 的调用的服务帐号,该帐号包含以下 Cloud SQL 角色之一,其中包括cloudsql.instances.connectcloudsql.instances.get权限:

    • 云 SQL 客户端
    • Cloud SQL 编辑器
    • 云 SQL 管理员

    这里要记住的两件事是,App Engine 默认使用 App Engine 柔性环境服务帐户,该帐户具有 Editor 角色,并且如果使用的服务帐户属于与 Cloud SQL 实例不同的项目,则 Cloud需要为这两个项目添加 SQL Admin API 和 IAM 权限。

  4. app.yaml根据您希望连接的选项进行配置:

    Unix 套接字

    beta_settings:
    cloud_sql_instances: INSTANCE_CONNECTION_NAME
    

    TCP 端口

    beta_settings:
      cloud_sql_instances: INSTANCE_CONNECTION_NAME:port
    
  5. 包括以下环境变量:

     env_variables:
       DB_USER: MY_DB_USER
       DB_PASS: MY_DB_PASSWORD
       DB_NAME: MY_DATABASE
       # e.g. my-awesome-project:us-central1:my-cloud-sql-instance
       CLOUD_SQL_CONNECTION_NAME: <MY-PROJECT>:<INSTANCE-REGION>:<INSTANCE-NAME>
    

请记住,这DB_NAME是您之前创建的数据库的名称,其中INSTANCE-NAME是您的 Cloud SQL 实例的名称。

  1. 最后,使用以下代码段来配置连接:

     const createUnixSocketPool = async (config) => {
       const dbSocketPath = process.env.DB_SOCKET_PATH || "/cloudsql"
    
       // Establish a connection to the database
       return await mysql.createPool({
         user: process.env.DB_USER, // e.g. 'my-db-user'
         password: process.env.DB_PASS, // e.g. 'my-db-password'
         database: process.env.DB_NAME, // e.g. 'my-database'
         // If connecting via unix domain socket, specify the path
         socketPath: `${dbSocketPath}/${process.env.CLOUD_SQL_CONNECTION_NAME}`,
         // Specify additional properties here.
         ...config
       });
     }
    

您可以在Google 文档Github中找到所有详细信息


推荐阅读