Connecting Heroku App to Atlas MongoDB Cloud service

前端 未结 5 852
孤街浪徒
孤街浪徒 2020-11-29 21:26

To antecipate the question: do I need to get SSL support on Heroku in order to establish a connection between Heroku and Atlas Mong

相关标签:
5条回答
  • 2020-11-29 21:59

    You can find all IP ranges for Heroku with this command:

    HEROKU_REGION=eu; sudo apt -qqy install curl jq 2>/dev/null 1>/dev/null; heroku regions --json 2>/dev/null | jq ".[] | select(.name==\"$HEROKU_REGION\") | .provider.region" | (REGION=$(cat); curl -s https://ip-ranges.amazonaws.com/ip-ranges.json |  jq ".prefixes[] | select(.region==$REGION) | .ip_prefix")
    
    0 讨论(0)
  • 2020-11-29 22:11

    very simple solution! just add to the white list IP in mongo atlas the adress "0.0.0.0/0"

    it will open the mongo atlas to all the world..... so it os not for production but it helps for small tests

    0 讨论(0)
  • 2020-11-29 22:12

    What I think might fix your problem

    Disclaimer: I have used neither Heroku nor MongoDB Atlas but I am looking into them.

    According to a Github issue I found, you will get that error message if you haven't whitelisted the server IP addresses in MongoDB Atlas.

    Reading the MongoDB Atlas docs, the only way I see to do this in combination with Heroku dynos is to add 0.0.0.0/0 (i.e. all addresses) to your MongoDB Atlas whitelist.

    Give that a try and please report back whether you can instantiate a connection.

    On SSL

    Trying to reply to the SSL question, I do not think that you need to enable it on Heroku based on what I read, although I am not totally sure.

    If the MongoDB server performed certificate validation, the Node.js code for connecting to it would have to look like the following (taken from the Node.js driver documentation):

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

    If the MongoDB server does not check for any SSL certificates, you can simply use code like the following (also taken from the Node.js driver documentation):

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

    Given that the Atlas documentation contains the following example code for connecting to it from Node.js, I think that you do not have to enable SSL on 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();
    });
    

    0 讨论(0)
  • 2020-11-29 22:13

    I solved this by installing an addon(i used Fixie Socks) for Static IP addresses for database requests and other TCP connections. More options here: https://elements.heroku.com/addons#network

    0 讨论(0)
  • 2020-11-29 22:24

    Also had to add 0.0.0.0/0 to the Mongo IP whitelist AND redeploy my app on Heroku for it to finally work (before changing IP, a CORS error was thrown).

    0 讨论(0)
提交回复
热议问题