将 Heroku App 连接到 Atlas MongoDB 云服务

新手上路,请多包涵

预测问题:我是否需要在 Heroku 上获得 SSL 支持才能使用 SSL 在 HerokuAtlas MongoDB Cloud 之间建立连接? (访问 Atlas MongoDB Cloud 服务 需要 TSL/SSL 连接)。

我正在尝试将我用 node.js 编写的 Heroku 应用程序连接到托管在 Atlas MongoDB Cloud 上的集群。

我当前的数据库托管在 mLab(作为 Heroku 插件),用于通过 mongoose 访问集群的 MongoDB URI 是(使用 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 shell 连接到集群。

但是,在 Heroku 中运行应用程序时,无法建立连接。在浏览器 JS 控制台中,我收到 503 服务不可用消息。在heroku中,我得到了错误:

 no primary found in replica set

我知道 Atlas MongoDB Cloud 需要 SSL 连接,这与 mLab 不同。在我的本地机器中,我想使用自签名证书成功连接到集群。

我的问题是:我是否需要在 Heroku 中获得 SSL 支持才能访问在 Heroku 和 MongoDB Atlas 之间建立安全连接?或者 Heroku 中的 SSL 支持只需要客户端/Heroku 安全连接?

原文由 amaralbf 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 664
2 个回答

我认为可能会解决您的问题

免责声明: 我既没有使用 Heroku 也没有使用 MongoDB Atlas,但我正在研究它们。

根据 我发现的 Github 问题,如果您没有将 MongoDB Atlas 中的服务器 IP 地址列入白名单,您将收到该错误消息。

阅读 MongoDB Atlas 文档,我看到与 Heroku dynos 结合使用的唯一方法是将 0.0.0.0/0 (即所有地址)添加到您的 MongoDB Atlas 白名单中。

试一试,请报告您是否可以实例化连接。

在 SSL 上

尝试回答 SSL 问题时,我认为您不需要根据我阅读的内容在 Heroku 上启用它,尽管我并不完全确定。

如果 MongoDB 服务器执行证书验证,则用于连接到它的 Node.js 代码必须如下所示(取自 Node.js 驱动程序文档):

 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 证书,您可以简单地使用如下代码(也取自 Node.js 驱动程序文档):

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

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

鉴于 Atlas 文档 包含以下用于从 Node.js 连接到它的示例代码,我认为您 不必 在 Heroku 上启用 SSL:

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


原文由 Niklas Wenzel 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以使用以下命令找到 Heroku 的所有 IP 范围:

 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")

原文由 ehpc 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题