【问题标题】:DB Connection Unavailable Lambda with Cloud Watch Event Rules带有 Cloudwatch 事件规则的数据库连接不可用 Lambda
【发布时间】: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


【解决方案1】:

您需要在处理程序中将预热事件作为特殊情况进行处理。基本上,您的处理程序应该在通过预热事件调用时立即返回。

serverless-warmup-plugin给出的例子中,你可以这样做,

module.exports.lambdaToWarm = function(event, context, callback) {
  // Immediate response for WarmUP plugin
  if (event.source === 'serverless-plugin-warmup') {
    console.log('WarmUP - Lambda is warm!')
    return callback(null, 'Lambda is warm!')
  }

  // add lambda logic after
}

请注意,开头有一个 if 语句来检查它是否是一个热身事件。如果是,请立即成功返回。

这个检查应该在开头,这样它就不需要连接到 MongoDB。

【讨论】:

  • 我更喜欢使用 CloudWatch 事件规则而不是无服务器预热插件。我能够从 cloudwatch 事件规则传递我自己的自定义事件数据。提前返回不是这里的问题。我已经在这样做了。然而,你让我意识到,也许我可以在我的高阶函数中返回。
  • 我同意你的观点并使用自定义事件数据。使用插件更容易说明它。
猜你喜欢
  • 2020-07-27
  • 1970-01-01
  • 2022-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-25
  • 2019-07-15
  • 2020-07-22
相关资源
最近更新 更多