node.js - AWS lambda 与 mongoose 到 Atlas - MongoNetworkError

标签 node.js mongodb amazon-web-services mongoose aws-lambda

我正在尝试将 MongoDB Atlas 与 mongoose 和 aws lambda 连接,但出现错误 MongoNetworkError

  • AWS Lambda
  • Mongoose
  • MongoDB 图集

相同的代码使用serverless-offline进行了测试并且工作完美,问题是当我将其部署到AWS Lambda时。

这是代码片段

'use strict';
const mongoose = require('mongoose');
const MongoClient = require('mongodb').MongoClient;
let dbuser  = process.env.DB_USER;
let dbpass = process.env.DB_PASSWORD;
let opts = { 
    bufferCommands: false, 
    bufferMaxEntries: 0, 
    socketTimeoutMS: 2000000, 
    keepAlive: true, 
    reconnectTries: 30, 
    reconnectInterval: 500,
    poolSize: 10,
    ssl: true,
 };
const uri = `mongodb+srv://${dbuser}:${dbpass}@carpoolingcluster0-bw91o.mongodb.net/awsmongotest?retryWrites=true&w=majority`;
// simple hello test
module.exports.hello = async (event, context, callback) => {
    const response = {
        body: JSON.stringify({message:'AWS Testing :: '+ `${dbuser} and ${dbpass}`}),
    };
    return response;
};
// connect using mongoose
module.exports.cn1 = async (event, context, callback)  => {
    context.callbackWaitsForEmptyEventLoop = false;
    let conn = await mongoose.createConnection(uri, opts);
    const M = conn.models.Test || conn.model('Test', new mongoose.Schema({ name: String }));
    const doc = await M.find();
    const response = {
        body: JSON.stringify({data:doc}),
    };
    return response;
};
// connect using mongodb
module.exports.cn2 = (event, context, callback) => {
    context.callbackWaitsForEmptyEventLoop = false;
    console.log("Connec to mongo using connectmongo ");
    MongoClient.connect(uri).then(client => {
        console.log("Success connect to mongo DB::::");
        client.db('awsmongotest').collection('tests').find({}).toArray()
            .then((result)=>{
                let response = {
                    body: JSON.stringify({data:result}),
                }
                callback(null, response)
            })
    }).catch(err => {
        console.log('=> an error occurred: ', err);
        callback(err);
    });
};

在 CloudWatch 日志中我看到此错误

{
    "errorType": "MongoNetworkError",
    "errorMessage": "failed to connect to server [carpoolingcluster0-shard-00-02-bw91o.mongodb.net:27017] on first connect [MongoNetworkError: connection 5 to carpoolingcluster0-shard-00-02-bw91o.mongodb.net:27017 closed]",
    "stack": [
        "MongoNetworkError: failed to connect to server [carpoolingcluster0-shard-00-02-bw91o.mongodb.net:27017] on first connect [MongoNetworkError: connection 5 to carpoolingcluster0-shard-00-02-bw91o.mongodb.net:27017 closed]",
        "    at Pool.<anonymous> (/var/task/node_modules/mongodb-core/lib/topologies/server.js:431:11)",
        "    at Pool.emit (events.js:189:13)",
        "    at connect (/var/task/node_modules/mongodb-core/lib/connection/pool.js:557:14)",
        "    at callback (/var/task/node_modules/mongodb-core/lib/connection/connect.js:109:5)",
        "    at runCommand (/var/task/node_modules/mongodb-core/lib/connection/connect.js:129:7)",
        "    at Connection.errorHandler (/var/task/node_modules/mongodb-core/lib/connection/connect.js:321:5)",
        "    at Object.onceWrapper (events.js:277:13)",
        "    at Connection.emit (events.js:189:13)",
        "    at TLSSocket.<anonymous> (/var/task/node_modules/mongodb-core/lib/connection/connection.js:350:12)",
        "    at Object.onceWrapper (events.js:277:13)",
        "    at TLSSocket.emit (events.js:189:13)",
        "    at _handle.close (net.js:597:12)",
        "    at TCP.done (_tls_wrap.js:388:7)"
    ],
    "name": "MongoNetworkError",
    "errorLabels": [
        "TransientTransactionError"
    ]
}

这是 github 上重现错误的示例。

https://github.com/rollrodrig/error-aws-mongo-atlas

只需克隆它,npm install,添加您的 mongo atlas 用户、密码并推送到 AWS。

谢谢。

最佳答案

需要一些额外的步骤才能让 lambda 调用外部端点

https://aws.amazon.com/premiumsupport/knowledge-center/internet-access-lambda-function/

您的图集还应该将连接 lambda 的服务器的 IP 地址列入白名单。

另一个值得考虑的选择 - VPC peering在您的 lambda VPC 和 Atlas 之间。

关于node.js - AWS lambda 与 mongoose 到 Atlas - MongoNetworkError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56878131/

相关文章:

java - MongoClient.getDatabase() 是只返回一个数据库实例还是实际创建它?

javascript - 将日期从字符串转换为日期 Javascript

node.js - Node Express 应用程序 - 结构化单元/集成测试

javascript - 正则表达式不匹配标签与属性?

java - 如何通过 bulkrequest 更新嵌套的 elasticsearch 值?

amazon-web-services - 在 CloudFormation 中创建 ALB 目标组

java - 如何从 Scala 连接 Amazon Redshift

Node.js 不提供超过 5 个浏览器选项卡

mongodb - 如何精确匹配整个文档?

当超过 100 个结果时,Node.js + mongoose find 卡住 Node