web-dev-qa-db-fra.com

Comment connecter Google Cloud SQL à partir de Cloud Functions?

J'essaie d'utiliser Cloud Functions for Firebase pour créer une API qui communique avec une instance de Google Cloud SQL (PostgreSQL).

J'utilise le déclencheur HTTP (S).

Lorsque je liste blanche l'adresse IP de mon bureau, je peux me connecter au Cloud SQL avec le code node.js de la fonction de ma machine locale. Mais lorsque je déploie, je ne peux pas me connecter et je ne peux pas comprendre l'adresse IP de l'hôte du serveur de Firebase Function sur une liste blanche.

Comment communiquez-vous avec Google Cloud SQL à partir de Cloud Functions for Firebase?

Merci!

// 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

Ce n'est pas possible actuellement. C'est cependant une demande de fonctionnalité sur le suivi des problèmes # 36388165 :

Se connecter à Cloud SQL à partir de Cloud Functions n’est actuellement pas pris en charge, car le socket UNIX n’existe pas (ce qui provoque ENOENT) et il n'y a pas de plage IP définie pour la liste blanche (ce qui provoque ETIMEDOUT). Un La possibilité est d’ajouter à la liste blanche 0.0.0.0/0 l’instance Cloud SQL mais ceci n'est pas recommandé pour des raisons de sécurité.

S'il s'agit d'une fonctionnalité importante pour vous, je vous conseillerais de visiter le site issuetracker et de lancer la demande de fonctionnalités pour l'aider à gagner en popularité.

10
Niklas B

J'ai trouvé la réponse dans une discussion plus approfondie de # 36388165 .

disclaimer: cela ne semble pas être annoncé officiellement, donc peut changer après. aussi je teste uniquement dans mysql. mais nature de cette solution, je pense que la même manière devrait fonctionner comme dans le module pg (il semble que accepte le chemin du socket de domaine } en tant que paramètre Host)

EDIT (2017/12/7): Google semble fournir accès anticipé officiel } _, et la même méthode fonctionne toujours.
EDIT (2018/07/04): il semble que quelqu'un copie/copie simplement mon code d'exemple et ait des problèmes. comme google dit , vous devez utiliser un pool de connexions pour éviter les fuites de connexion SQL. (cela provoque ECONNREFUSE) alors je modifie un peu l'exemple de code. 

in https://issuetracker.google.com/issues/36388165#comment44 } _ Google type indique que l'instance de fonction cloud peut parler au sql de nuage via le socket de domaine dans le chemin spécial '/ cloudsql/$ PROJECT_ID: $ REGION: $ DBNAME '. 

Je peux réellement connecter et utiliser le cloud SQL en-dessous du code de fonction cloud. 

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

J'espère que cela aiderait ceux qui ne peuvent pas attendre l'annonce officielle de Google.

26
takehiro iyatomi

Recherchez votre région et votre nom d’instance dans GCP> SQL> Instances page:

 enter image description here

Enregistrez votre mot de passe de base de données dans Environnement Firebase en exécutant:

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

Ensuite...

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

Voir aussihttps://stackoverflow.com/a/48825037/82686 (en utilisant la syntaxe JavaScript moderne via Babel)

7
Konstantin Tarkus

il y a maintenant une documentation officielle à ce sujet, toujours en version bêta bien qu'en juillet 2018

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

5
Ron Chan

Vous pouvez également autoriser La plage d'adresses IP de Firebase car nous ne savons pas vraiment quelle adresse IP Firebase utilise en externe.

J'ai expérimenté dessus. Google Cloud SQL N'UTILISE PAS les adresses IP internes. Donc, vous NE POUVEZ PAS utiliser 10.128.0.0/20 pour autoriser les adresses IP internes de votre Google Cloud SQL.

Réponse

Donc, depuis la console, allez à Google Cloud SQL > Instance > Authorization, vous pouvez ajouter:

151.101.0.0/17

Ce qui vous permettra d'utiliser 151.101.0.0 à 151.101.127.255, dans lequel le domaine du serveur Firebase est actuellement 151.101.1.195 et 151.101.65.195.

Je ne sais pas si cette adresse IP changera un jour.

Assurez-vous également que votre base de données Cloud SQL utilise la zone us-central. Firebase semble être disponible dans us-central.

0
Franz Noel

Fonctions Cloud - Services pris en charge - Je ne vois pas Cloud SQL sur cette liste, il n'est peut-être pas encore pris en charge.

0
Quang Van