如何从云函数连接Google Cloud SQL?

16 浏览
0 Comments

如何从云函数连接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);
  }
});

admin 更改状态以发布 2023年5月19日
0
0 Comments

新答案:

请参阅其他答案,它现在得到了官方支持。 https://cloud.google.com/functions/docs/sql

旧答案:

目前还不可能。 但它在问题跟踪器 #36388165 上是一项功能请求:

当前不支持从Cloud Functions连接到Cloud SQL,因为UNIX套接字不存在(导致ENOENT),并且没有定义的IP范围可供白名单(导致ETIMEDOUT)。 一个可能的方法是将 Cloud SQL 实例的0.0.0.0/0 加入白名单,但出于安全原因,不建议这样做。

如果这对您来说是一个重要功能,我建议您访问问题跟踪器,并标记该功能请求,以帮助它获得更多的关注度。

0
0 Comments

我在#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
    });
};

我希望这对于那些无法等待谷歌的正式通知的人会有所帮助。

0