繁体   English   中英

Heroku App连接Atlas MongoDB云服务

[英]Connecting Heroku App to Atlas MongoDB Cloud service

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


我正在尝试将用 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运行App时,无法建立连接。 在浏览器 JS 控制台中,我收到 503 服务不可用消息。 在 heroku 中,我得到错误:

no primary found in replica set

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

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

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

免责声明:我既没有使用过 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();
});

鉴于阿特拉斯文档包含了连接到它从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();
});

您可以使用以下命令查找 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")

还必须将 0.0.0.0/0 添加到 Mongo IP 白名单并在 Heroku 上重新部署我的应用程序才能使其最终工作(在更改 IP 之前,引发了 CORS 错误)。

非常简单的解决方案! 只需将地址“0.0.0.0/0”添加到mongo图集中的白名单IP

它将向全世界开放 mongo 图集......所以它不是用于生产,但它有助于小型测试

我通过为数据库请求和其他 TCP 连接的静态 IP 地址安装一个插件(我使用Fixie Socks )解决了这个问题。 更多选项: https : //elements.heroku.com/addons#network

由于允许从任何地方访问并不安全,而且 IP 范围可能会发生变化,因此我最终安装了附加的QuotaGuard Static IP's (它为 IP 白名单提供了 2 个 IP 地址),因此SOCKS5 代理可以与 QGTunnel 一起使用

应下载 QGTunnel 并将其包含在代码库中

curl https://s3.amazonaws.com/quotaguard/qgtunnel-latest.tar.gz | tar xz

应该更新Procfile

web: bin/qgtunnel npm start

假设您想使用 QGTunnel 访问复制的 MongoDB 集群,其中 3 个副本位于主机上: rs01.mongodb.net:52115rs02.mongodb.net:52115rs1.mongodb.net:52115 对于此配置,您需要在透明模式下为端口 52115 上的每个主机创建 3 个单独的隧道。 完成此操作后,QGTunnel 将更改 DNS 解析过程以将这些主机名解析为适当的环回地址,并且复制集群的自动发现应按预期工作。

登录到云 MongoDB 站点并转到网络访问,单击“添加 IP 地址”,然后单击“允许从任何地方进行访问”即可

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM