Saltar al contenido

¿Cómo conectar Google Cloud SQL desde Cloud Functions?

Hola usuario de nuestra página, tenemos la solución a lo que estabas buscando, deslízate y la obtendrás más abajo.

Solución:

Encontré la respuesta en una discusión adicional de # 36388165.

descargo de responsabilidad: esto no parece anunciarse oficialmente, por lo que puede cambiar después. También solo pruebo en mysql. pero la naturaleza de esta solución, creo que debería funcionar de la misma manera que en el módulo pg (parece aceptar la ruta del socket del dominio como parámetro del host)

EDITAR (2017/12/7): Google parece proporcionar acceso temprano oficial, y el mismo método aún funciona.
EDITAR (2018/07/04): parece que hay alguien que simplemente copia y pega mi código de ejemplo y se mete en problemas. como dice google, debe usar el grupo de conexiones para evitar la fuga de conexión sql. (provoca ECONNREFUSE), así que cambio un poco el código de ejemplo.
EDITAR (2019/04/04): en el siguiente ejemplo, usar $DBNAME como nombre de instancia de llave inglesa es confuso, modifico el ejemplo.

en https://issuetracker.google.com/issues/36388165#comment44, el chico de Google dice que la instancia de la función en la nube puede hablar con la nube sql a través del socket del dominio en la ruta especial ‘/cloudsql/$PROJECT_ID:$REGION:$DBNAME’.

De hecho, puedo conectarme y operar SQL en la nube desde debajo del código de función de la nube.

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

Espero que esto sea de ayuda para aquellos que no pueden esperar el anuncio oficial de Google.

Nueva respuesta:

Ver otras respuestas, ahora es oficialmente compatible. https://cloud.google.com/functions/docs/sql

Respuesta antigua:

Actualmente no es posible. Sin embargo, es una solicitud de función en el rastreador de problemas #36388165:

Actualmente no se admite la conexión a Cloud SQL desde Cloud Functions, ya que el socket de UNIX no existe (lo que provoca ENOENT) y no hay un rango de IP definido para incluir en la lista blanca (lo que provoca ETIMEDOUT). Una posibilidad es incluir en la lista blanca 0.0.0.0/0 de la instancia de Cloud SQL, pero esto no se recomienda por razones de seguridad.

Si esta es una función importante para usted, le sugiero que visite el rastreador de problemas y marque la solicitud de función para ayudarla a ganar popularidad.

Encuentre la región de su base de datos y el nombre de la instancia en la página GCP > SQL > Instancias:

ingrese la descripción de la imagen aquí

Guarde la contraseña de su base de datos en el entorno de Firebase ejecutando:

$ firebase functions:config:set 
    db.user="" 
    db.password="" 
    db.database=""

Entonces…

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

Ver también https://stackoverflow.com/a/48825037/82686 (usando la sintaxis moderna de JavaScript a través de Babel)

Aquí tienes las comentarios y puntuaciones

Si estás de acuerdo, tienes la libertad de dejar un artículo acerca de qué le añadirías a esta división.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *