如何从云函数连接Google Cloud SQL?
如何从云函数连接Google Cloud SQL?
我正在尝试使用Cloud Functions for Firebase构建一个与Google Cloud SQL (PostgreSQL)实例通信的API。
我正在使用HTTP(S)触发器。
当我将我台式机的IP地址加入白名单时,我可以从本地机器连接到云SQL的函数node.js代码。但当我部署时,我无法连接,并且我无法找出Firebase Function服务器的HOST IP地址以加入白名单。
如何从Cloud Functions for Firebase访问Google Cloud SQL?
谢谢!
// Code Sample, of what's working on Localhost. var functions = require('firebase-functions'); var pg = require('pg'); var pgConfig = { user: functions.config().pg.user, database: functions.config().pg.database, password: functions.config().pg.password, host: functions.config().pg.host } exports.helloSql = functions.https.onRequest((request, response) => { console.log('connecting...'); try { client.connect(function(err) { if (err) throw err; console.log('connection success'); console.log('querying...'); client.query('SELECT * FROM guestbook;', function(err, result){ if (err) throw err; console.log('querying success.'); console.log('Results: ', result); console.log('Ending...'); client.end(function(err){ if (err) throw err; console.log('End success.'); response.send(result); }); }); }); } catch(er) { console.error(er.stack) response.status(500).send(er); } });
新答案:
请参阅其他答案,它现在得到了官方支持。 https://cloud.google.com/functions/docs/sql
旧答案:
目前还不可能。 但它在问题跟踪器 #36388165 上是一项功能请求:
当前不支持从Cloud Functions连接到Cloud SQL,因为UNIX套接字不存在(导致ENOENT),并且没有定义的IP范围可供白名单(导致ETIMEDOUT)。 一个可能的方法是将 Cloud SQL 实例的0.0.0.0/0 加入白名单,但出于安全原因,不建议这样做。
如果这对您来说是一个重要功能,我建议您访问问题跟踪器,并标记该功能请求,以帮助它获得更多的关注度。
我在#36388165的深入讨论中找到了答案。
声明:这似乎没有正式宣布,所以后面可能会有变化。而且我只在mysql中进行了测试。但考虑到这个解决方案的性质,我认为和pg模块一样的方法应该适用于(它似乎将域套接字路径作为主机参数接受)
编辑(2017/12/7):谷歌似乎提供了正式的早期访问,同样的方法仍然有效。
编辑(2018/07/04):似乎有人只是复制并粘贴我的示例代码,并陷入麻烦。正如谷歌所说,您应该使用连接池以避免SQL连接泄漏。 (它导致ECONNREFUSE),因此我稍微更改了示例代码。
编辑(2019/04/04):在下面的示例中,使用$ DBNAME作为spanner实例名称令人困惑,我修改了示例。
在https://issuetracker.google.com/issues/36388165#comment44中,谷歌的人说云函数实例可以通过特殊路径“/cloudsql/$PROJECT_ID:$REGION:$DBNAME”与云sql通信。
实际上,我可以从下面的云函数代码连接和操作云SQL。
const mysql = require('mysql'); const pool = mysql.createPool({ connectionLimit : 1, socketPath: '/cloudsql/' + '$PROJECT_ID:$REGION:$SPANNER_INSTANCE_NAME', user: '$USER', password: '$PASS', database: '$DATABASE' }); exports.handler = function handler(req, res) { //using pool instead of creating connection with function call pool.query(`SELECT * FROM table where id = ?`, req.body.id, function (e, results) { //made reply here }); };
我希望这对于那些无法等待谷歌的正式通知的人会有所帮助。