【发布时间】:2017-11-10 21:25:06
【问题描述】:
当我使用云监视事件规则来触发 lambda 以使其保持温暖时,我在连接到 mongodb 时遇到问题,当我尝试使用 serverless-plugin-warmup 时也遇到同样的问题。任何人都有关于为什么会发生这种情况的想法和想法?我还将我的数据库的 IP 列入白名单,并为我的 lambda 函数使用弹性 IP。云监视事件规则是否会导致 lambda 使用不同的 IP?
{"error":{"name":"MongoError","message":"no connection available"}}
我用以下代码包装我的函数,以确保在运行代码之前连接数据库
const mongoose = require('mongoose');
mongoose.Promise = global.Promise;
let cachedDB = null;
module.exports = fn => (...args) => {
const [, context] = args;
context.callbackWaitsForEmptyEventLoop = false;
if (cachedDB && cachedDB.readyState != 0 && cachedDB.readyState != 3) {
fn(...args);
} else {
mongoose.connect(process.env.MONGO_URI);
mongoose.connection.on('error', err => {
console.log('Connection Error');
console.log(err);
});
mongoose.connection.once('open', () => {
cachedDB = mongoose.connection;
fn(...args);
});
}
};
【问题讨论】:
-
这部分没有意义:“并为我的 lambda 函数使用弹性 IP”您不能将弹性 IP 分配给 Lambda 函数。你的意思是你为MongoDB服务器分配了一个弹性IP?您应该做的是将 Lambda 函数放置在与 MongoDB 服务器相同的 VPC 中,并使用私有 IP,而不是公共或弹性 IP 来寻址服务器。
-
@MarkB 我正在使用 Mongo Atlas(数据库即服务),我将通过弹性 IP 创建的 IP 列入白名单。我的 Lamba 功能在 VPN 中。我设置了一个互联网网关、子网、nat 网关和弹性 ip,这样当我的 lambdas 连接到 mongo atlas 时,它们正在使用一个静态 ip。
-
原始问题中应该包含很多信息。因此,Lambda 函数位于 VPC 中,位于具有到 NAT 网关的路由的私有子网中,并且您有分配给 NAT 网关的弹性 IP?我将首先尝试从其中一个相同私有子网中的 EC2 实例连接到 MongoDB,以确保来自 VPC->NAT->Mongo 的连接正常工作。
-
@MarkB mongo 绝对有效,但是当我设置云监视事件规则以每 5 分钟触发一次 lambdas 时,我会收到 mongo 错误。
-
我确信“mongo 绝对有效”。我正在尝试帮助您调试 VPC 网络配置,因为这是最有可能导致 Lambda 和 Mongo Atlas 服务之间的连接问题的区域。
标签: amazon-web-services aws-lambda serverless-framework