Подключение приложения Heroku к облачному сервису Atlas MongoDB

В antecipate вопрос: мне нужно сделать протокол SSL поддержка на Heroku для того, чтобы установить связь между здесь и Атлас MongoDB Облако использование SSL? (Соединение TSL / SSL является требование для доступа к облачному сервису Atlas MongoDB).


Я пытаюсь подключить приложение Heroku, написанное в узле.js, в кластер, размещенный в облаке Atlas MongoDB.

моя текущая база данных размещено в mLab (как надстройка Heroku), а URI MongoDB используется для доступа к кластеру через Мангуст (используя xxx опустить конфиденциальную информацию):

MONGODB_URI="mongodb://xxx:xxx@xxx-a0.mlab.com:23266,xxx-a1.mlab.com:xxx/xxx?replicaSet=rs-xxx"

Теперь, когда я перенес свои данные из mLab в Atlas MongoDB Cloud, я в настоящее время получаю доступ к кластеру с помощью URI:

MONGODB_URI="mongodb://xxx:xxx@cluster0-shard-xxx.mongodb.net:xxx,cluster0-shard-xxx.mongodb.net:xxx,cluster0-shard-xxx.mongodb.net:xxx/xxx?replicaSet=xxx&ssl=true&authSource=admin"

при запуске моего приложения Heroku локально на моей машине я могу получить доступ к базе данных без проблем. Я также могу подключиться к кластеру с помощью mongo ракушка.

однако при запуске приложения в Heroku соединение не может быть установлено. В консоли браузера JS я получаю сообщение 503 service unavailable. В Heroku, я получаю ошибку:

no primary found in replica set

Я знаю, что Atlas MongoDB Cloud требует SSL-соединения, в отличие от mLab. На моем локальном компьютере я полагаю, что для успешного подключения к кластеру используется самозаверяющий сертификат.

мой вопрос: мне нужно получить поддержку SSL в Heroku для того, чтобы иметь возможность доступа установить безопасное соединение между Heroku и MongoDB Atlas? Или SSL suport в Heroku требуется только для безопасного подключения клиента / Heroku?

2 ответов


что я думаю, может решить вашу проблему

отказ от ответственности: Я не использовал ни Heroku, ни MongoDB Atlas, но я изучаю их.

согласно проблеме Github, которую я нашел [1], вы получите это сообщение об ошибке, если у вас нет белого списка IP-адресов сервера в MongoDB Atlas.

чтение документов MongoDB Atlas [2], единственный способ сделать это в сочетании с Heroku dynos-добавить 0.0.0.0/0 (т. е. все адреса) для вашего MongoDB Атлас белый.

попробуйте и, пожалуйста, сообщите, можете ли вы создать экземпляр соединения.

на SSL

пытаясь ответить на вопрос SSL, я не думаю, что вам нужно включить его на Heroku на основе того, что я прочитал, хотя я не совсем уверен.

если сервер MongoDB выполнил проверку сертификата, узел.код JS для подключения к нему будет выглядеть следующим образом (взято из узла.документация по драйверу js [3]):

var MongoClient = require('mongodb').MongoClient,
  f = require('util').format,
  fs = require('fs');

// Read the certificates
var ca = [fs.readFileSync(__dirname + "/ssl/ca.pem")];
var cert = fs.readFileSync(__dirname + "/ssl/client.pem");
var key = fs.readFileSync(__dirname + "/ssl/client.pem");

// Connect validating the returned certificates from the server
MongoClient.connect("mongodb://localhost:27017/test?ssl=true", {
  server: {
      sslValidate:true
    , sslCA:ca
    , sslKey:key
    , sslCert:cert
    , sslPass:'10gen'
  }
}, function(err, db) {
  db.close();
});

если сервер MongoDB не проверяет наличие SSL-сертификатов,вы можете просто использовать следующий код (также взятый из узла.документация по драйверу js [3]):

var MongoClient = require('mongodb').MongoClient;

MongoClient.connect("mongodb://localhost:27017/test?ssl=true", function(err, db) {
  db.close();
});

учитывая, что документация Atlas [4]содержит следующий пример кода для подключения к нему из узла.Яш, я думаю, что вы делаете не должны включить SSL на Heroku:

var MongoClient = require('mongodb').MongoClient;

var uri = "mongodb://kay:myRealPassword@mycluster0-shard-00-00-wpeiv.mongodb.net:27017,mycluster0-shard-00-01-wpeiv.mongodb.net:27017,mycluster0-shard-00-02-wpeiv.mongodb.net:27017/admin?ssl=true&replicaSet=Mycluster0-shard-0&authSource=admin";
MongoClient.connect(uri, function(err, db) {
  db.close();
});

[1] https://github.com/meteor/meteor/issues/7492#issuecomment-236562860
[2] https://docs.atlas.mongodb.com/security-whitelist/
[3] https://mongodb.github.io/node-mongodb-native/2.2/tutorials/connect/ssl/
[4] https://docs.atlas.mongodb.com/driver-connection/#node-js-driver-example

Я решил это, установив аддон (я использовал Фикси Носки) для статических IP-адресов для запросов базы данных и других TCP-соединений. Дополнительные опции здесь:https://elements.heroku.com/addons#network