it-swarm.dev

Google Cloud SQL'i Cloud İşlevlerinden nasıl bağlanır?

Firebase için Cloud Functions uygulamasını bir Google Cloud SQL (PostgreSQL) örneğiyle konuşan bir API oluşturmak için kullanmaya çalışıyorum.

HTTP (S) tetikleyicisini kullanıyorum.

Masaüstümün IP adresini beyaz listeye aldığımda, Cloud SQL'e, yerel makinemin işlevinin node.js koduyla bağlanabiliyorum. Ancak konuşlandırdığımda bağlanamıyorum ve Firebase Function sunucusunun Host IP adresini beyaz listeye ekleyemiyorum.

Firebase için Bulut İşlevlerinden Google Cloud SQL ile nasıl konuşursunuz?

Teşekkürler!

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

Şu anda mümkün değil. Ancak, sorun izleyicide bir özellik isteğidir # 36388165 :

Cloud İşlevlerine Cloud SQL'e bağlanmak şu anda .__ değil. UNIX soketi olmadığı için (ENOENT'e neden olan) ve beyaz listeye alınacak tanımlanmış bir IP aralığı yok (ETIMEDOUT'a neden oluyor). Bir Olasılık, Cloud SQL örneğinden 0.0.0.0/0 'a beyaz listeyi eklemektir ancak Bu güvenlik nedeniyle tavsiye edilmez.

Bu sizin için önemli bir özellikse, düzenleyiciyi ziyaret etmenizi ve popülerlik kazanmasına yardımcı olmak için özellik isteğini yıldızlamanızı öneririm.

10
Niklas B

Cevabını # # 36388165 tartışmalarında buldum.

feragatname: Bu resmi olarak duyurulmuş gibi görünmüyor, bu yüzden daha sonra değişebilir. Ayrıca sadece mysql içinde test ediyorum. ancak bu çözümün doğası gereği, pg modülündeki gibi aynı yolun çalışması gerektiğini düşünüyorum ( etki alanı soket yolu kabul et , Host parametresi olarak görünüyor)

EDIT (2017/12/7): google resmi erken erişim sağlıyor gibi görünüyor ve aynı yöntem hala çalışıyor.
EDIT (2018/07/04): Örnek kodumu kopyalayıp yapıştıran ve başını belaya sokan biri olduğu anlaşılıyor. google diyor gibi sql bağlantısı sızıntısını önlemek için bağlantı havuzunu kullanmalısınız. (ECONNREFUSE'e neden olur) bu yüzden örnek kodu biraz değiştirdim. 

https://issuetracker.google.com/issues/36388165#comment44 _ google’da, bulut işlevi örneğinin, özel yoldaki etki alanı soketi üzerinden cloud sql ile konuşabileceğini söylüyor '/ cloudsql/$ PROJECT_ID: $ REGION: $ DBNAME'. 

Aslında bulut SQL'i bulut fonksiyon kodunun altından bağlayıp çalıştırabilirim. 

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

Umarım bu google’dan resmi bir duyuru beklemeyenler için yardımcı olur.

26
takehiro iyatomi

GCP> SQL> Örnekler sayfasında veritabanı bölgenizi ve örnek adınızı bulun:

 enter image description here

Veritabanı şifrenizi Firebase ortamına kullanarak:

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

Sonra...

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

Ayrıca bakınızhttps://stackoverflow.com/a/48825037/82686 (Babil aracılığıyla modern JavaScript sözdizimini kullanarak)

7
Konstantin Tarkus

bunun için resmi belgeler var, hala Temmuz 2018’de olduğu gibi Beta’da

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

5
Ron Chan

Ayrıca Firebase IP adresleri aralığına izin verebilirsiniz çünkü Firebase'in harici olarak hangi IP adresini kullandığını bilmiyoruz.

Bunu denedim. Google Cloud SQL dahili IP adreslerini KULLANMAYACAKTIR. Bu nedenle, Google Cloud SQL için dahili IP adreslerine izin vermek için 10.128.0.0/20 kullanamazsınız.

Cevap

Yani konsoldan, Google Cloud SQL > Instance > Authorization adresine gidin, şunu ekleyebilirsiniz:

151.101.0.0/17

Firebase sunucu etki alanı şu anda 151.101.0.0 ve 151.101.127.255 olduğu 151.101.1.195 - 151.101.65.195 IP adres aralığına izin verir.

Bu IP adresinin değişip değişmeyeceğinden emin değilim.

Ayrıca, Cloud SQL Veritabanınızın us-central bölgesini kullandığından emin olun. Firebase us-central içinde mevcut görünüyor.

0
Franz Noel

Bulut İşlevleri - Desteklenen Hizmetler - Bu listede Cloud SQL göremiyorum, bu nedenle henüz desteklenmiyor.

0
Quang Van