如何从 Cloud Functions 连接 Google Cloud SQL?

新手上路,请多包涵

我正在尝试使用 Cloud Functions for Firebase 构建一个与 Google Cloud SQL (PostgreSQL) 实例对话的 API。

我正在使用 HTTP(S) 触发器。

当我将桌面的 IP 地址列入白名单时,我可以使用本地计算机上函数的 node.js 代码连接到 Cloud SQL。但是当我部署时,我无法连接,我无法弄清楚 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);
  }
});

原文由 Quang Van 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 686
2 个回答

新答案

查看其他答案,现已正式支持。 https://cloud.google.com/functions/docs/sql

旧答案

目前不可能。然而,这是问题跟踪器 #36388165 上的功能请求:

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

如果这对您来说是一个重要的功能,我建议您访问问题跟踪器并为功能请求加注星标,以帮助它获得普及。

原文由 Niklas B 发布,翻译遵循 CC BY-SA 4.0 许可协议

我在 #36388165 的进一步讨论中找到了答案。

免责声明:这似乎没有正式宣布,因此可能会在之后发生变化。我也只在 mysql 中测试。但是这个解决方案的性质,我认为应该像在 pg 模块中一样工作(它似乎 接受域套接字路径 作为主机参数)

编辑(2017/12/7) :谷歌似乎提供 官方早期访问,同样的方法仍然有效。

编辑(2018/07/04) :似乎有人只是复制并粘贴我的示例代码并遇到麻烦。正如谷歌 所说,你应该使用连接池来避免 sql 连接泄漏。 (它会导致 ECONNREFUSE)所以我稍微更改了示例代码。 编辑(2019/04/04) :在下面的示例中,使用 $DBNAME 作为扳手实例名称令人困惑,我修改了示例。

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

我希望这对那些等不及谷歌官方宣布的人有所帮助。

原文由 takehiro iyatomi 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题