programing

Atlas MongoDB 클라우드 서비스에 Heroku 앱 연결하기

skycolor 2023. 5. 12. 21:58
반응형

Atlas MongoDB 클라우드 서비스에 Heroku 앱 연결하기

질문을 예상하려면: SSL을 사용하여 Heroku와 Atlas MongoDB 클라우드연결을 설정하려면 Heroku에서 SSL 지원을 받아야 합니까? (TSL/SSL 연결은 Atlas MongoDB 클라우드 서비스에 액세스하는 데 필요합니다.)


나는 node.js로 작성된 나의 Heroku App을 Atlas MongoDB Cloud에서 호스팅되는 클러스터에 연결하려고 합니다.

현재 데이터베이스는 mLab(Heroku Add-on)에서 호스팅되며, 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 서비스 사용 불가 메시지가 표시됩니다.헤로쿠에서는 다음과 같은 오류가 발생합니다.

no primary found in replica set

Atlas MongoDB Cloud는 mLab과 다르게 SSL 연결이 필요한 것으로 알고 있습니다.로컬 컴퓨터에서 클러스터에 성공적으로 연결하기 위해 자체 서명된 인증서가 사용되고 있는 것 같습니다.

제 질문은 Heroku와 MongoDB Atlas 간의 보안 연결을 설정하기 위해 Heroku에서 SSL 지원을 받아야 합니까?아니면 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 서버가 인증서 유효성 검사를 수행한 경우 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();
});

다음 명령을 사용하여 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")

또한 Mongo IP 화이트리스트에 0.0.0/0을 추가하고 Heroku에 앱을 다시 배포하여 최종적으로 작동해야 했습니다(IP를 변경하기 전에 CORS 오류가 발생했습니다).

데이터베이스 요청 및 기타 TCP 연결을 위한 정적 IP 주소에 대한 추가 기능(Fixie Socks 사용)을 설치하여 해결했습니다. 많은 옵션: https://elements.heroku.com/addons#network

매우 간단한 해결책! mongo atlas의 화이트리스트 IP 주소 "0.0.0/0"을 추가하면 됩니다.

몽고 지도책을 전 세계에 공개할 것입니다. 그래서 그것은 생산을 위한 것이 아니라 작은 시험에 도움이 될 것입니다.

하지 않고 변경될 수 에 추가 .QuotaGuard Static IP's(IP 화이트리스트에 대해 2개의 IP 주소를 제공함) SOCKS5 Proxy를 QG 터널과 함께 사용할 수 있습니다.

QG 터널을 다운로드하여 코드베이스에 포함해야 합니다.

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

Proc 파일을 업데이트해야 합니다.

web: bin/qgtunnel npm start

의 복제본이 QG rs01.mongodb.net:52115,rs02.mongodb.net:52115,그리고.rs1.mongodb.net:52115이 구성의 경우 투명 모드에서 포트 52115의 각 호스트에 대해 3개의 별도 터널을 생성해야 합니다.이 작업이 완료되면 QGTunnel이 DNS 확인 프로세스를 변경하여 이러한 호스트 이름을 적절한 루프백 주소로 확인하고 복제된 클러스터에 대한 자동 검색이 의도한 대로 작동합니다.

언급URL : https://stackoverflow.com/questions/42159175/connecting-heroku-app-to-atlas-mongodb-cloud-service

반응형