Ошибка подключения при попытке подключиться к Cloud-sql sql-server из облачных функций

Я использую функции firebase для подключения к cloud-sql (Micorsoft SQL Server). Я пробовал следующее для подключения к SQL Server через общедоступный IP-адрес:

/*Tedious Start*/
var TediousConnection = require('tedious').Connection;
var TediousRequest = require('tedious').Request;
var TediousTypes = require('tedious').TYPES;
const config = {
  user: 'admin',
  password: 'password',
  server: '12.345.5.678',
  database: 'mma',
  //host: 'myproject:us-central1:my-db'
};
app.get('/mssql/', async(req, res) => {
  var sql = require('mssql');
  sql
    .connect(config)
    .then(function() {
      //6.
      var request = new sql.Request();
      //7.
      request
        .query('SET NOCOUNT ON;select * from student')
        .then(function(recordset) {
          // send records as a response
          res.send(recordset.recordset);
          sql.close();
        })
        .catch(function(err) {
          //8.
          console.log(err);
          sql.close();
        });
      res.end();
    })
    .catch(function(err) {
      //9.
      console.log(err);
    });
});

Я получаю следующую ошибку:

{ ConnectionError: Failed to connect to 12.345.5.678:1433 in 15000ms
    at Connection.tedious.once.err (/srv/node_modules/mssql/lib/tedious/connection-pool.js:68:17)
    at Object.onceWrapper (events.js:315:30)
    at emitOne (events.js:116:13)
    at Connection.emit (events.js:211:7)
    at Connection.connectTimeout (/srv/node_modules/mssql/node_modules/tedious/lib/connection.js:1195:10)
    at Timeout.connectTimer.setTimeout [as _onTimeout] (/srv/node_modules/mssql/node_modules/tedious/lib/connection.js:1157:12)
    at ontimeout (timers.js:498:11)
    at tryOnTimeout (timers.js:323:5)
    at Timer.listOnTimeout (timers.js:290:5)
  code: 'ETIMEOUT',
  originalError: 
   { ConnectionError: Failed to connect to 12.345.5.678:1433 in 15000ms
    at ConnectionError (/srv/node_modules/mssql/node_modules/tedious/lib/errors.js:13:12)
    at Connection.connectTimeout (/srv/node_modules/mssql/node_modules/tedious/lib/connection.js:1195:54)
    at Timeout.connectTimer.setTimeout [as _onTimeout] (/srv/node_modules/mssql/node_modules/tedious/lib/connection.js:1157:12)
    at ontimeout (timers.js:498:11)
    at tryOnTimeout (timers.js:323:5)
    at Timer.listOnTimeout (timers.js:290:5)
     message: 'Failed to connect to 12.345.5.678:1433 in 15000ms',
     code: 'ETIMEOUT' },
  name: 'ConnectionError' }

Я думаю, что облачная функция не может связаться с сервером sql. Я также попытался добавить учетную запись службы, чтобы иметь разрешения cloudql.

Я подумал, что делаю что-то не так с моими облачными функциями, и попробовал cloudql-postgresql из облачных функций. Я могу успешно подключиться к ClouSQL-postgresql из облачной функции.

Например, в случае cloudql-postgresql хост принимает значение, подобное следующему, используя сокет домена unix:

config.host = `/cloudsql/${process.env.CLOUD_SQL_CONNECTION_NAME}`;

В случае Cloudsql-mssql я предоставляю IP-адрес для сервера. Я не знаю, что мне не хватает. Есть ли проблема с брандмауэром, о которой мне нужно позаботиться?


person mkg fabo    schedule 27.05.2020    source источник


Ответы (1)


Согласно документации:

Cloud Functions не поддерживает подключение к Cloud SQL для SQL Server через общедоступный IP-адрес. Вместо этого используйте частный IP

вместо этого вы должны подключиться напрямую, используя частный IP-адрес и порт 1433 для вашего экземпляра.

person Chris32    schedule 27.05.2020
comment
Спасибо! Я должен был быть слепым, как летучая мышь, чтобы пропустить это! - person mkg fabo; 27.05.2020
comment
Если быть точным, то документ неправильный. Облачная функция поддерживает соединение с SQL-сервером, но открывает сокет Unix для соединения. однако никакие драйверы сервера SQL не совместимы с этим типом связи, и поэтому вы не можете использовать этот сокет. - person guillaume blaquiere; 28.05.2020