質問を予測するには:Herokuで[〜#〜] ssl [〜#〜]サポートを取得してHerokuおよびSSLを使用するAtlas MongoDB Cloud? (TSL/SSL接続は、Atlas MongoDBクラウドサービスにアクセスするための 要件 です)。
Node.jsで記述されたHerokuアプリをAtlas MongoDB Cloudでホストされているクラスターに接続しようとしています。
現在のデータベースはmLabで(Herokuアドオンとして)ホストされており、mongooseを介してクラスターにアクセスするために使用されるMongoDB URIは(xxxを使用して機密情報を省略しています):
MONGODB_URI="mongodb://xxx:[email protected]:23266,xxx-a1.mlab.com:xxx/xxx?replicaSet=rs-xxx"
MLabからAtlas MongoDB Cloudにデータを移行したので、現在、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"
自分のマシンでHerokuアプリをローカルで実行すると、問題なくデータベースにアクセスできます。また、mongo Shellを使用してクラスターに接続することもできます。
ただし、Herokuでアプリを実行すると、接続を確立できません。ブラウザJSコンソールで、503サービスを利用できませんというメッセージが表示されます。 herokuでは、エラーが発生します。
no primary found in replica set
Atlas MongoDB Cloudでは、mLabとは異なり、SSL接続が必要であることを認識しています。ローカルマシンでは、クラスターに正常に接続するために自己署名証明書が使用されていると想定しています。
私の質問は次のとおりです。HerokuとMongoDB Atlas間の安全な接続にアクセスできるようにするには、HerokuでSSLサポートを取得する必要がありますか?または、HerokuのSSLサポートは、クライアント/ Herokuセキュア接続にのみ必要ですか?
免責事項: HerokuもMongoDB Atlasも使用していませんが、調べています。
私が見つけたGithubの問題[1]によると、MongoDB AtlasでサーバーIPアドレスをホワイトリストに登録していない場合、そのエラーメッセージが表示されます。
MongoDB Atlasのドキュメント[2]を読んで、Heroku dynosと組み合わせてこれを行う唯一の方法は、0.0.0.0/0
(つまり、すべてのアドレス)をMongoDB Atlasホワイトリストに追加します。
それを試してみて、接続をインスタンス化できるかどうかを報告してください。
SSLの質問に答えようとすると、読んだ内容に基づいてHerokuでSSLを有効にする必要があるとは思いませんが、完全にはわかりません。
MongoDBサーバーが証明書の検証を実行した場合、それに接続するためのNode.jsコードは次のようになります(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();
});
MongoDBサーバーがSSL証明書をチェックしない場合は、次のようなコードを使用できます(Node.jsドライバーのドキュメント[3]からも取得できます)。
var MongoClient = require('mongodb').MongoClient;
MongoClient.connect("mongodb://localhost:27017/test?ssl=true", function(err, db) {
db.close();
});
Atlasのドキュメント[4]にNode.jsから接続するための次のサンプルコードが含まれている場合、notSSLを有効にする必要があると思います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
これを解決するには、データベースリクエストおよびその他のTCP接続の静的IPアドレスに Fixie Socks を使用)アドオンをインストールします。その他のオプション: https ://elements.heroku.com/addons#network