我正在尝试将mongodb连接用于AWS Lambdas,这是我的连接功能:
const openMongodbConnection = ({ config }) => (
process.mongoConnection ? Promise.resolve() : mongoose.connect(config.MONGO_URL, {
bufferCommands: false,
bufferMaxEntries: 0,
keepAlive: true,
})
.then((connection) => {
process.mongoConnection = connection;
return Promise.resolve();
}, err => (
Promise.reject({
statusCode: 500,
errorCode: [{
code: 'DatabaseError',
description: `unable to connect to mongo db: ${err} ${JSON.stringify(config)}`,
}],
})
))
);
数据库位于AWS VPC内,没有外部访问权限。 冷启动效果很好,但有时会出现如下超时错误:
2018-10-03T18:36:06.984Z 7ab97df7-c739-11e8-89bf-87260b172585 MongoNetworkError: connection 2 to some.ip.from.server:27017 timed out
at Socket.<anonymous> (/var/task/node_modules/mongodb-core/lib/connection/connection.js:258:7)
at Socket.g (events.js:292:16)
at emitNone (events.js:86:13)
at Socket.emit (events.js:185:7)
at Socket._onTimeout (net.js:338:8)
at ontimeout (timers.js:386:14)
at tryOnTimeout (timers.js:250:5)
at Timer.listOnTimeout (timers.js:214:5)
在函数开始处我也有context.callbackWaitsForEmptyEventLoop = false;
。
此错误是完全随机的,有时可以工作,有时不能,我正在考虑每次出现新请求时就打开和关闭连接,但是我知道这会降低Lambda的性能,并且还会增加I来自mongodb服务器的/ O操作。
我们将不胜感激。
答案 0 :(得分:0)
好吧,我来这里是为了寻找答案。.无论如何,到目前为止,我们发现的唯一答案是每次调用lambda时都要打开和关闭数据库连接。
很明显,当lambda不工作时,AWS暂停了该进程,这意味着该套接字对mongodb服务器而言似乎已死,因此由于认为它是一个已死的客户端而断开了连接。因此,尝试在lambda调用之间保留套接字的情况经常会导致超时。
答案 1 :(得分:0)
问题是当lambda函数从AWS Fargate触发时。
当AWS使用IAMRole:PassRole时,它会制动VPC / Subnet配置,从而使lambda函数无法连接到mongo数据库。
答案 2 :(得分:-1)
我们遇到了同样的问题。事实证明,我们的问题主要是在处理程序函数外部建立连接。在没有实际调用处理程序函数的情况下,仅通过需要lambda.js
文件就可以打开连接。
当我们在处理程序函数内移动连接代码时,该问题消失了:
// lambda.js
// DO NOT open mongodb connection here
exports.handler = async (event, context) => {
// open the mongo connection here
// openMongodbConnection()
}
我不确定这怎么会引起问题,但可能与子网配置的应用顺序有关。