我有一个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
错误。
问题是:我需要在Google Functions代码中进行哪些更改才能使用私有IP访问它?谢谢
私有 IP 只能由同一虚拟私有云 (VPC) 上的其他服务访问。由于您的函数在托管网络上运行,因此它当前位于您的 VPC 外部,并且无权访问您的 Cloud SQL 实例。
Google Cloud Functions 确实提供了一个 unix 域套接字来与 Cloud SQL 实例进行交互,但它要求实例具有公共 IP。只要mysqlConfig.socketPath = cloudsql/${connectionName};
使用正确的连接名称(格式为 project:region:instance
),就应该能够连接。如果您使用的是跨产品或跨区域设置,此处提供了更多说明。
更新:自最初发布此内容以来,已推出一款名为无服务器 VPC 连接器的新产品,该产品可以允许访问 VPC 资源。您可以按照说明对其进行配置,然后使用实例的私有 IP(而不是上面提到的/cloudsql/
套接字)连接到实例。