Node.js 无法确定Mongoose到DocumentDB的SSL连接错误

Node.js 无法确定Mongoose到DocumentDB的SSL连接错误,node.js,mongoose,amazon-elastic-beanstalk,aws-documentdb,aws-documentdb-mongoapi,Node.js,Mongoose,Amazon Elastic Beanstalk,Aws Documentdb,Aws Documentdb Mongoapi,我在AWS Elastic Beanstalk(EB)中有两个环境,运行Node.js应用程序,利用Mongoose框架连接到DocumentDB。其中一个环境莫名其妙地停止工作,而另一个环境工作正常。两者都是从CI/CD生成服务器部署的,该服务器利用EB CLI部署应用程序代码 有问题的环境在nodejs.log中生成以下错误: name: 'MongooseTimeoutError', reason: { Error: unable to get local issuer ce

我在AWS Elastic Beanstalk(EB)中有两个环境,运行Node.js应用程序,利用Mongoose框架连接到DocumentDB。其中一个环境莫名其妙地停止工作,而另一个环境工作正常。两者都是从CI/CD生成服务器部署的,该服务器利用EB CLI部署应用程序代码

有问题的环境在nodejs.log中生成以下错误:

  name: 'MongooseTimeoutError',
  reason:
   { Error: unable to get local issuer certificate
       at TLSSocket.onConnectSecure (_tls_wrap.js:1058:34)
       at TLSSocket.emit (events.js:198:13)
       at TLSSocket._finishInit (_tls_wrap.js:636:8)
     name: 'MongoNetworkError',
     [Symbol(mongoErrorContextSymbol)]: {} },
  [Symbol(mongoErrorContextSymbol)]: {} }
两者在连接到同一实例时使用相同的连接字符串
mongodb://******:*****@docdb-2019-08-***-***-***-***-***-***.cluster-*****.us-east-2.docdb.amazonaws.com:27017/db_name?ssl=true&ssl_-ca_-certs=/etc/ssl/certs/rds组合ca bundle.pem&replicaSet=rs0

证书pem文件与两者使用的文件相同,并通过EB.ebextensions脚本部署到实例

我尝试过的事情:

  • 连接到问题环境的EC2实例,安装了mongodb外壳,并能够使用Mongo connect字符串中指定的证书成功连接到DocumentDB实例
  • 通过Elastic Beanstalk web管理控制台重建了EB环境

当时有点固执己见。

也有同样的问题。。不确定这是否会随着2019年证书的变更而中断。。无论如何,我必须通过代码更改(将sslCA参数添加到下面的Mongoose connect方法中)和从连接字符串中删除ssl证书位置来解决这个问题

connect(uri, {useNewUrlParser: true,
        useFindAndModify: false,
        sslCA: [fs.readFileSync("rds-combined-ca-bundle.pem")]}, (err: any)

Amazon的DocumentDB of icial documentation有一个示例代码,可以正常工作,不会触发此错误

这是Node.JS示例,为了清晰起见,进行了一些修改:

const { MongoClient } = require('mongodb');
const fs = require('fs');

const caContent = [fs.readFileSync("/path/to/rds-combined-ca-bundle.pem")];
const options = { 
  sslValidate: true,
  sslCA: caContent,
  useNewUrlParser: true
};
const connUri = 'mongodb://user:pass@sample-cluster.node.us-east-1.docdb.amazonaws.com:27017/sample-database?ssl=true&replicaSet=rs0&readPreference=secondaryPreferred';

const client = new MongoClient(connUri, options);
const client = await MongoClient.connect();

是的。。这是一种方法;)。。无论如何,我是来自AWS论坛响应的同一用户。我想我也会把它贴在这里。