使用私有IP从Google Functions连接到Cloud SQL

时间:2019-01-23 03:41:03

标签: javascript google-cloud-functions google-cloud-sql

我有一个Google Cloud SQL实例,并计划使用NodeJS从Google Function中访问它。代码如文档中所述

// 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));
      }
    });
  });
}

使用公共IP设置数据库后,我便可以访问它。但是,当我将其设置为“专用IP”时,会出现ECON refused错误。

问题是:要使用私有IP访问它,我需要在Google Functions代码中进行哪些更改?谢谢

1 个答案:

答案 0 :(得分:0)

私有IP仅可由同一Virtual Private Cloud (VPC)上的其他服务访问。由于您的功能在托管网络上运行,因此它当前位于VPC外部,并且无法访问Cloud SQL实例。

Google Cloud Functions确实提供了一个Unix域套接字来与Cloud SQL实例接口。只需使用实例的连接名称更新mysqlConfig.socketPath = cloudsql/${connectionName};行,它就可以连接。如果您使用的是跨产品或跨区域设置,则更多说明here