使用私有 IP 从 Google 函数连接到云 SQL

Connect to Cloud SQL from Google Functions using Private IP

我有一个 Google 云 SQL 实例并计划使用 NodeJS 从 Google 函数访问它。代码在文档中给出

// mysql
const mysql = require('mysql');
const connectionName = process.env.INSTANCE_CONNECTION_NAME || 'project:region:sql-instance';
const dbUser = process.env.SQL_USER || 'root';
const dbPassword = process.env.SQL_PASSWORD || 'password';
const dbName = process.env.SQL_NAME || 'database';

const mysqlConfig = {
  connectionLimit: 1,
  user: dbUser,
  password: dbPassword,
  database: dbName,
};
//if (process.env.NODE_ENV === 'production') {
  mysqlConfig.socketPath = `/cloudsql/${connectionName}`;
//}

// Connection pools reuse connections between invocations,
// and handle dropped or expired connections automatically.
let mysqlPool;

function searchDB() {
  if (!mysqlPool) {
    mysqlPool = mysql.createPool(mysqlConfig);
    console.log(mysqlPool);
  }
  return new Promise( function( resolve, reject ) {
    mysqlPool.query('SELECT * FROM table', (err, results) => {
      if (err) {
        console.error('error in retrieving data:', err);
        resolve(''); // sending blank response
      } else {
        console.log('success in getting data', JSON.stringify(results));
        resolve(JSON.stringify(results));
      }
    });
  });
}

我设置了publicIP后就可以访问数据库了。但是,当我将其设置为私有 IP 时,出现 ECON refused 错误。

问题是:我需要在 Google 函数代码中做哪些更改才能使用私有 IP 访问它?谢谢

私有 IP 只能由同一 Virtual Private Cloud (VPC) 上的其他服务访问。由于您的函数在托管网络上运行,因此它目前在您的 VPC 之外,并且无权访问您的 Cloud SQL 实例。

Google Cloud Functions 确实提供了一个 unix 域套接字来连接 Cloud SQL 实例,但它要求实例具有 public IP。只要 mysqlConfig.socketPath = cloudsql/${connectionName}; 使用正确的连接名称(格式为 project:region:instance),您就应该能够连接。如果您使用的是跨产品或跨区域设置,还有更多说明 here

更新: 自最初发布此内容以来,一个名为 Serverless VPC connector has become available that can allow access to a VPC resource. You can follow the instructions 的新产品对其进行配置,然后使用其私有 IP(而不是/cloudsql/ 上面提到的套接字)。