【问题标题】:Unable to connect to Cloud MySQL from Node JS in App Engine无法从 App Engine 中的 Node JS 连接到 Cloud MySQL
【发布时间】:2021-01-24 01:07:10
【问题描述】:

我有一个在本地运行的带有 MySQL 的 NodeJS 应用程序,但现在我已经将它部署在 APP Engine 中,我需要将它与 MySQL Google Cloud 连接,我已经创建了 MySQL 实例和数据库,但我无法连接我的应用程序(App Engine 中的 NodeJS)与我在 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;

Archivo .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"

请帮帮我。

【问题讨论】:

  • 让 mysql 受到来自 Internet 的攻击是一个非常非常糟糕的主意。阅读 REST,你有一个处理所有流量的服务器端脚本
  • @nbk 对不起,我是新人,请您多解释一下您所说的以及我如何解决让 mysql 容易受到攻击的问题!
  • node js 已经是一个服务器端脚本,你想访问云中的 mysql 数据。由于您应该使 mysql 服务器可用,因此您有一些可能性,您可以为云编写一个节点 js 脚本,该脚本将在 clud 服务器上运行,或者您编写一个具有相同意图的 php 脚本,或者您编写一个可以 cakk 的 angularjs 脚本使用 ajax 从云服务器获取数据。想想,为什么不直接在云端运行你的nodejs nt呢?
  • 您似乎发布了敏感/私人信息。如果是这种情况,请重置您的密码和/或撤销 API 密钥和令牌,因为它们在互联网上发布时被视为已泄露。

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


【解决方案1】:

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

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

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

  1. 在您的 Cloud SQL 实例中创建 databasea user

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

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

    • 云 SQL 客户端
    • 云 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. 最后,使用下面的sn -p来配置连接:

     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 DocumentationGithub 中找到所有详细信息

【讨论】:

    猜你喜欢
    • 2021-04-08
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    • 2015-09-15
    • 2019-11-27
    相关资源
    最近更新 更多