5

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

有问题的环境在 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-combined-ca-bundle.pem&replicaSet=rs0

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

我尝试过的事情:

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

目前有点卡住,没有想法。

4

2 回答 2

3

亚马逊的 DocumentDB 官方文档有一个示例代码可以正常工作并且不会触发此错误。

https://docs.aws.amazon.com/documentdb/latest/developerguide/connect_programmatically.html

这是 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();
于 2021-02-19T20:34:00.720 回答
2

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

connect(uri, {useNewUrlParser: true,
        useFindAndModify: false,
        sslCA: [fs.readFileSync("rds-combined-ca-bundle.pem")]}, (err: any)
于 2020-01-06T16:34:11.873 回答