web-dev-qa-db-ja.com

Google Cloud SQLをCloud Functionsから接続する方法は?

Cloud Functions for Firebase を使用して、Google Cloud SQL(PostgreSQL)インスタンスと通信するAPIを構築しようとしています。

HTTP(S)トリガーを使用しています。

デスクトップのIPアドレスをホワイトリストに登録すると、ローカルマシンから関数のnode.jsコードを使用してCloud SQLに接続できます。しかし、デプロイすると、接続できず、Firebase FunctionのサーバーのホストIPアドレスをホワイトリストに把握できません。

Firebase用Cloud Functionsから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);
  }
});
29
Quang Van

現在は不可能です。ただし、これは課題トラッカーの機能リクエストです #36388165

UNIXソケットが存在せず(ENOENTが発生)、ホワイトリストに定義されたIP範囲がない(ETIMEDOUTが発生する)ため、Cloud FunctionsからCloud SQLへの接続は現在サポートされていません。 1つの可能性は、Cloud SQLインスタンスから0.0.0.0/0をホワイトリストに登録することですが、これはセキュリティ上の理由から推奨されません。

これがあなたにとって重要な機能である場合、IssueTrackerにアクセスして機能リクエストにスターを付けて、人気を獲得することをお勧めします。

10
Niklas B

#36388165 の詳細な議論で答えを見つけました。

免責事項:これは公式に発表されていないようですので、その後変更される可能性があります。また、mysqlでのみテストします。しかし、このソリューションの性質は、pgモジュールと同じ方法で動作するはずだと思います( ドメインソケットパスを受け入れる Hostパラメータとして)

EDIT(2017/12/7):googleは 公式の早期アクセス を提供しているようで、同じ方法がまだ機能しています。
EDIT(2018/07/04):私のサンプルコードをコピーアンドペーストして、誰かが入っているようですトラブル。 google says のように、接続プールを使用してSQL接続リークを回避する必要があります。 (ECONNREFUSEが発生します)、サンプルコードを少し変更します。 EDIT(2019/04/04):以下の例では、スパナインスタンス名として$ DBNAMEを使用するのはわかりにくいので、例を変更します。

in https://issuetracker.google.com/issues/36388165#comment44 google guyは、クラウド関数インスタンスが特別なパス '/ cloudsql/$ PROJECT_ID:$ REGIONのドメインソケットを介してクラウドSQLと通信できると言います: $ DBNAME '。

実際に、以下のクラウド機能コードからクラウド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
    });
};

これがグーグルからの公式発表を待つことができない人たちの助けになることを願っています。

29

現在、これに関する公式のドキュメントがありますが、2018年7月の時点ではベータ版のままです

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

8
Ron Chan

GCP> SQL> Instances ページでデータベース領域とインスタンス名を検索します。

enter image description here

次を実行して、データベースパスワードを Firebase environment に保存します。

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

その後...

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

参照https://stackoverflow.com/a/48825037/82686 (Babel経由の最新のJavaScript構文を使用)

8

Firebaseが外部で使用するIPアドレスが実際にはわからないため、Firebase IPアドレスの範囲を認証することもできます。

私はそれを試しました。 Google Cloud SQLは内部IPアドレスを使用しません。したがって、10.128.0.0/20を使用して、Google Cloud SQLの内部IPアドレスを許可することはできません。

回答

そのため、コンソールからGoogle Cloud SQL > Instance > Authorizationに移動して、次を追加できます。

151.101.0.0/17

Firebaseサーバードメインが現在151.101.0.0および151.101.127.255である151.101.1.195から151.101.65.195のIPアドレス範囲が許可されます。

このIPアドレスが今後変更されるかどうかはわかりません。

また、Cloud SQL Databaseがus-centralゾーンを使用していることを確認してください。 Firebaseはus-centralで利用できるようです。

0
Franz Noel

クラウド機能-サポートされるサービス -このリストにCloud SQLが表示されないため、まだサポートされていない可能性があります。

0
Quang Van