【问题标题】:Error MongooseServerSelectionError: Could not connect to any servers in your MongoDB Atlas cluster错误 MongooseServerSelectionError:无法连接到 MongoDB Atlas 集群中的任何服务器
【发布时间】:2022-11-27 02:04:55
【问题描述】:

我的 aws lambda 函数有一个非常烦人的问题。

有时,请求会因以下错误而失败。我不知道原因,这是非常随机的,因为我认为我的请求有 95% 成功,但失败的 5% 会造成严重损害并明显阻止我的应用程序正常运行。

Runtime.UnhandledPromiseRejection: MongooseServerSelectionError: Could not connect to any servers in your MongoDB Atlas cluster. One common reason is that you're trying to access the database from an IP that isn't whitelisted. Make sure your current IP address is on your Atlas cluster's IP whitelist: https://docs.atlas.mongodb.com/security-whitelist/

然而在 mongodb atlas => 网络访问中,我将 ip 地址设置为 0.0.0.0

这是我目前的情况

const mongoose = require('mongoose');
let conn = null;

const uri = process.env.MONGO_URI;
module.exports = function connect() {
  if (conn == null) {
    conn = mongoose.connect(uri, {
      serverSelectionTimeoutMS: 5000,
      socketTimeoutMS: 10000,
      useNewUrlParser: true,
      keepAlive: true,
      useUnifiedTopology: true
    }).then(() => mongoose);

    // `await`ing connection after assigning to the `conn` variable
    // to avoid multiple function calls creating new connections
    await conn;
  }

  return conn;
}

有什么建议吗?

【问题讨论】:

    标签: node.js mongodb express mongoose aws-lambda


    【解决方案1】:

    这可能是您应该接受 Mongo Atlas 支持的事情,因为正如您正确提到的那样,0.0.0.0 上根本没有黑名单。我确实注意到,这只是关于问题所在的建议,可能不是实际问题。有鉴于此,我想提出以下几点:

    • 除非您设置了reserved concurrency,否则 Lambda 将启动尽可能多的功能来处理您的负载,这很容易超过您的 Mongo Atlas 集群的最大连接数。您是否检查过您是否只是超过了最大连接数?
    • 您是否考虑过将您的 lambda 放在 VPC 中?默认情况下,Lambda 可以访问 Internet。如果您将 lambda 函数放在 VPC 私有子网中,它们将失去对 Internet 的默认访问权限,但现在可以使用 NAT 网关或 NAT 实例访问 Internet。这样做的好处是您可以为这个 NAT 网关/实例分配一个静态 IP 地址。这意味着您可以告诉 Mongo Atlas 只接受来自此 IP 地址的连接,从而使您的数据库更安全——无需将 0.0.0.0 列入白名单——有关更多信息,请参阅 this article

    【讨论】:

    • 感谢您的回答。我已经检查了 aws 和 mongodb 上的日志。我处于测试/开发模式,所以我不太可能达到 lambda 和 mongodb atlas 的最大连接限制。但是我认为有时 aws lambda 随机无法连接到 mongodb 集群。所以现在,我正在寻找一种解决方案来强制我的 lambda 函数在初始连接失败时重试连接到我的 mongodb 集群。有什么建议吗?
    【解决方案2】:

    您是否设法找到解决方案?我面临着完全相同的问题。

    【讨论】:

    猜你喜欢
    • 2021-04-23
    • 1970-01-01
    • 2020-09-08
    • 2022-07-30
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    • 2018-03-05
    • 2018-08-10
    相关资源
    最近更新 更多