wake-up-neo.com

So verbinden Sie Google Cloud SQL über Cloud-Funktionen

Ich versuche, Cloud Functions für Firebase zu verwenden, um eine API zu erstellen, die mit einer Google Cloud SQL (PostgreSQL) -Instanz kommuniziert.

Ich benutze HTTP (S) -Trigger.

Wenn ich die IP-Adresse meines Desktops auflisten möchte, kann ich mich mit dem node.js-Code der Funktion von meinem lokalen Computer aus mit Cloud SQL verbinden. Bei der Bereitstellung kann ich jedoch keine Verbindung herstellen und ich kann die Host-IP-Adresse des Firebase-Servers nicht auf die Whitelist ermitteln.

Wie sprechen Sie über Cloud-Funktionen für Firebase mit Google Cloud SQL?

Vielen Dank!

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

Es ist momentan nicht möglich. Es ist jedoch eine Funktionsanforderung für den Issue Tracker # 36388165 :

Das Herstellen einer Verbindung zu Cloud SQL über Cloud-Funktionen ist derzeit nicht unterstützt, da der UNIX-Socket nicht existiert (was ENOENT verursacht) und Es gibt keinen definierten IP-Bereich für die Whitelist (wodurch ETIMEDOUT verursacht wird). Ein Die Möglichkeit besteht darin, 0.0.0.0/0 aus der Cloud-SQL-Instanz auf die Positivliste zu setzen, jedoch Dies wird aus Sicherheitsgründen nicht empfohlen.

Wenn dies ein wichtiges Feature für Sie ist, würde ich vorschlagen, dass Sie den Issuetracker besuchen und die Feature-Anfrage markieren, um die Popularität zu erhöhen.

10
Niklas B

Ich fand eine Antwort in der weiteren Diskussion von # 36388165 .

haftungsausschluss: Dies scheint nicht offiziell bekannt zu sein, kann sich also später ändern. auch ich teste nur in mysql. Aber die Natur dieser Lösung, ich denke, dass die gleiche Weise wie in pg-Modul funktionieren sollte (es scheint akzeptieren Sie den Domain-Socket-Pfad als Host-Parameter.

EDIT (2017/12/7): Google scheint Official Early Access bereitzustellen, und dieselbe Methode funktioniert immer noch.
EDIT (2018/07/04): Es scheint, dass jemand meinen Beispielcode kopiert und eingefügt hat und in Schwierigkeiten gerät. Wie bei google sagt sollten Sie einen Verbindungspool verwenden, um SQL-Verbindungslecks zu vermeiden. (es verursacht ECONNREFUSE) also ändere ich den Beispielcode ein bisschen. 

in https://issuetracker.google.com/issues/36388165#comment44 google guy sagt, dass die Cloud-Funktionsinstanz mit dem Cloud-SQL-Server über den Domain-Socket in einem speziellen Pfad kommunizieren kann '/ cloudsql/$ PROJECT_ID: $ REGION: $ DBNAME '. 

Ich kann Cloud SQL von unterhalb des Cloud-Funktionscodes tatsächlich verbinden und betreiben. 

const mysql = require('mysql');
const pool = mysql.createPool({
    connectionLimit : 1,
    socketPath: '/cloudsql/' + '$PROJECT_ID:$REGION:$DBNAME',
    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
    });
};

Ich hoffe, das wäre eine Hilfe für diejenigen, die nicht auf offizielle Ankündigung von Google warten können.

26

Suchen Sie auf der Seite GCP> SQL> Instances nach Ihrer Datenbankregion und dem Instanznamen:

enter image description here

Speichern Sie Ihr Datenbankkennwort in Firebase-Umgebung , indem Sie Folgendes ausführen:

$ firebase functions:config:set \
    db.user="<username>" \
    db.password="<password>" \
    db.database="<database>"

Dann...

db.js

const { Pool } = require('pg');
const { config } = require('firebase-functions');

const project = process.env.GCP_PROJECT;
const region = 'europe-west1';
const instance = 'db';

module.exports = new Pool({
  max: 1,
  Host: `/cloudsql/${project}:${region}:${instance}`,
  ...config().db
});

someFunction.js

const { https } = require('firebase-functions');
const db = require('./db');

module.exports = https.onRequest((req, res) =>
  db
    .query('SELECT version()')
    .then(({ rows: [{ version }]) => {
      res.send(version);
    }));

Siehe auch _ ​​ https://stackoverflow.com/a/48825037/82686 (mit moderner JavaScript-Syntax über Babel)

7

es gibt jetzt offizielle Unterlagen dafür, die sich noch in der Beta-Version vom Juli 2018 befinden

https://cloud.google.com/functions/docs/sql

5
Ron Chan

Sie können auch Bereich der Firebase-IP-Adressen autorisieren, da wir nicht wissen, welche IP-Adresse Firebase extern verwendet.

Ich habe damit experimentiert. Google Cloud SQL VERWENDET KEINE internen IP-Adressen. Sie können also NICHT 10.128.0.0/20 verwenden, um interne IP-Adressen für Ihre Google Cloud SQL zuzulassen.

Antworten

Gehen Sie von der Konsole aus zu Google Cloud SQL > Instance > Authorization. Sie können Folgendes hinzufügen:

151.101.0.0/17

Damit können Sie 151.101.0.0 bis 151.101.127.255 den IP-Adressbereich angeben, wobei die Firebase-Serverdomäne derzeit 151.101.1.195 und 151.101.65.195 lautet.

Ich bin nicht sicher, ob sich diese IP-Adresse jemals ändern wird.

Stellen Sie außerdem sicher, dass Ihre Cloud SQL-Datenbank die Zone us-central verwendet. Firebase scheint in us-central verfügbar zu sein.

0
Franz Noel

Cloud-Funktionen - Unterstützte Dienste - Ich sehe Cloud SQL nicht in dieser Liste. Vielleicht wird es noch nicht unterstützt.

0
Quang Van