mysql - 无法从 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"
请帮我。
解决方案
从 App Engine Flexible 连接到 Cloud SQL 实例有两种选择。您可以通过实例的公共 IP 或私有 IP 进行连接。
我的建议是通过私有 IP 进行连接,因为通过私有 IP 的连接提供了更低的延迟和有限的攻击向量,因为它们不需要遍历互联网。
假设您已经有一个实例并通过公共 IP 连接,步骤如下:
instance_connection_name
为您的实例获取。可以通过实例Overview,gcloud sql instances describe [INSTANCE_NAME]
命令找到。它有一个projectID:region:instanceName
格式。授予您的应用用于验证对 Cloud SQL 的调用的服务帐号,该帐号包含以下 Cloud SQL 角色之一,其中包括
cloudsql.instances.connect
和cloudsql.instances.get
权限:- 云 SQL 客户端
- Cloud SQL 编辑器
- 云 SQL 管理员
这里要记住的两件事是,App Engine 默认使用 App Engine 柔性环境服务帐户,该帐户具有 Editor 角色,并且如果使用的服务帐户属于与 Cloud SQL 实例不同的项目,则 Cloud需要为这两个项目添加 SQL Admin API 和 IAM 权限。
app.yaml
根据您希望连接的选项进行配置:Unix 套接字
beta_settings: cloud_sql_instances: INSTANCE_CONNECTION_NAME
TCP 端口
beta_settings: cloud_sql_instances: INSTANCE_CONNECTION_NAME:port
包括以下环境变量:
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 实例的名称。
最后,使用以下代码段来配置连接:
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中找到所有详细信息
推荐阅读
- windows - Windows 不支持特权模式
- android - 如何使用 ViewModel 在 Activity 之间发送数据
- flake8 - 当我使用 flake8 时,如何修复由下划线引起的未使用错误
- javascript - 是否可以使用 Angular 在运行时从系统环境变量中获取数据?
- r - 数学方程符号 $$ 不会在 r markdown 输出中消失
- aframe - 添加mtl时obj文件变白
- r - 将参数传递给geom_qq中的分布
- php - 循环遍历 php 中 JSONArray 的值
- influxdb - InfluxDB 禁用下采样
- php - 从服务器发送的文本消息的格式