web-dev-qa-db-fra.com

Connecter l'application Heroku au service Cloud Atlas MongoDB

Pour anticiper la question: dois-je obtenir [~ # ~] ssl [~ # ~] le support sur Heroku afin d'établir une connexion entre Heroku et Atlas MongoDB Cloud utilisant SSL? (La connexion TSL/SSL est un exigence pour accéder au service Cloud Atlas MongoDB).


J'essaie de connecter mon application Heroku, écrite dans node.js, à un cluster hébergé sur Atlas MongoDB Cloud.

Ma base de données actuelle est hébergée chez mLab (en tant que module complémentaire Heroku), et l'URI MongoDB utilisé pour accéder au cluster via mangouste est (en utilisant xxx pour omettre les informations confidentielles):

MONGODB_URI="mongodb://xxx:[email protected]:23266,xxx-a1.mlab.com:xxx/xxx?replicaSet=rs-xxx"

Maintenant que j'ai migré mes données de mLab vers Atlas MongoDB Cloud, j'accède actuellement au cluster à l'aide de l'URI:

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

Lorsque j'exécute mon application Heroku localement sur ma machine, je peux accéder à la base de données sans problème. Je peux également me connecter au cluster à l'aide de mongo Shell.

Cependant, lors de l'exécution de l'application dans Heroku, la connexion ne peut pas être établie. Dans la console Browser JS, j'obtiens le message service 503 non disponible. Dans Heroku, je reçois l'erreur:

no primary found in replica set

Je suis conscient que Atlas MongoDB Cloud nécessite une connexion SSL, différent de mLab. Sur ma machine locale, je suppose qu'un certificat auto-signé est utilisé pour se connecter avec succès au cluster.

Ma question est: dois-je obtenir un support SSL dans Heroku afin de pouvoir accéder à établir la connexion sécurisée entre Heroku et MongoDB Atlas? Ou le support SSL dans Heroku n'est requis que pour une connexion sécurisée client/Heroku?

17
Bruno Amaral

Ce que je pense pourrait résoudre votre problème

Disclaimer: Je n'ai utilisé ni Heroku ni MongoDB Atlas mais je les regarde.

Selon un problème Github que j'ai trouvé [1], vous obtiendrez ce message d'erreur si vous n'avez pas ajouté les adresses IP du serveur à la liste blanche dans MongoDB Atlas.

En lisant les documents MongoDB Atlas [2], la seule façon que je vois de le faire en combinaison avec les dynos Heroku est d'ajouter 0.0.0.0/0 (c'est-à-dire toutes les adresses) à votre liste blanche MongoDB Atlas.

Essayez et veuillez nous signaler si vous pouvez instancier une connexion.

Sur SSL

En essayant de répondre à la question SSL, je ne pense pas que vous deviez l'activer sur Heroku en fonction de ce que j'ai lu, bien que je ne sois pas totalement sûr.

Si le serveur MongoDB a effectué la validation du certificat, le code Node.js pour s'y connecter devrait ressembler à ce qui suit (extrait de la documentation du pilote Node.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();
});

Si le serveur MongoDB ne vérifie aucun certificat SSL, vous pouvez simplement utiliser un code comme celui-ci (également extrait de la documentation du pilote Node.js [3]):

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

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

Étant donné que la documentation Atlas [4] contient l'exemple de code suivant pour s'y connecter à partir de Node.js, je pense que vous n'avez pas à activer SSL sur Heroku:

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

var uri = "mongodb://kay:[email protected]: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
20
Niklas Wenzel

J'ai résolu cela en installant un addon (j'ai utilisé Fixie Socks ) pour les adresses IP statiques pour les requêtes de base de données et autres TCP. Plus d'options ici: https : //elements.heroku.com/addons#network

1
metakungfu