NodeJS 连接到Cloud SQL mySQL with Cloud run

hgncfbus  于 11个月前  发布在  Node.js
关注(0)|答案(1)|浏览(107)

我在cloud run上运行一个discord bot(不理想,但云构建要快得多,管理也要便宜得多),我希望将其连接到公共IP上的云mySQL数据库。当尝试创建连接池并使用该连接池时,会遇到很多errors,特别是ETIMEDOUT。
它是通过在我的构建脚本中创建一个dockerfile来部署的,不知道这是否重要。

function createConnectionPoolCloud(){
  const dboptions = {
    connectionLimit : 10,
    socketPath: process.env.INSTANCE_UNIX_SOCKET,
    user     : process.env.DB_USER,
    password : process.env.DB_PASS,
    database : process.env.DB_NAME,
    waitForConnections: true,
    connectTimeout: 5000
  }
  return mysql.createPool(dboptions);
};

字符串
这就是我使用的代码,我使用的是msql 2库。
我已经将cloud sql示例连接到我的cloud run部署,并在服务帐户上设置了cloud sql admin,& client角色。我已经测试了与本地机器的sql连接,这是正常的。我已经尝试了一下超时,但它超时了,无论持续时间如何。我还确保了unix套接字是正确的/cloudsql/instanceconnectionname。
我已经遵循了these instructions as well,并且我已经设置了cloud sql,run和sql admin api。
不知道到底是什么原因导致了这个问题,我一用这个函数创建池,然后执行一个pool.promise(),然后执行一个promisePool.query().,就得到了这个错误。看了一些其他的帖子,没有一个解决方案似乎是可行的。在我的本地机器上,我记录了整个池对象,只是为了确保我能看到一些东西,但这些东西根本没有出现在云日志中,这可能只是记录整个对象的性质,但值得一提。

ezykj2lf

ezykj2lf1#

我使用了same instructions,它对我很有效。

const mysql = require('mysql2/promise');

const dboptions = {
  socketPath: '/cloudsql/<PROJECT_ID>:<REGION>:<INSTANCE_NAME>',
  user: 'root',
  password: 'my-password',
  database: 'my-database',
  waitForConnections: true,
  connectTimeout: 5000
}
const pool = await mysql.createPool(dboptions);
const [result] = await pool.query( `SELECT NOW();`);
console.table(result); // prints returned time value from server

字符串
你应该考虑使用Node.js连接器,因为它将为你处理证书和mTLS连接的管理。而且它不需要附加“云SQL连接”。
下面是如何启动一个新的mysql2连接池。

import mysql from 'mysql2/promise';
import {Connector} from '@google-cloud/cloud-sql-connector';

const connector = new Connector();
const clientOpts = await connector.getOptions({
  instanceConnectionName: 'my-project:region:my-instance',
  ipType: 'PUBLIC',
});
const pool = await mysql.createPool({
  ...clientOpts,
  user: 'my-user',
  password: 'my-password',
  database: 'db-name',
});
const conn = await pool.getConnection();
const [result] = await conn.query( `SELECT NOW();`);
console.table(result); // prints returned time value from server

await pool.end();
connector.close();


更多信息请访问https://github.com/GoogleCloudPlatform/cloud-sql-nodejs-connector#using-with-mysql

相关问题