You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS Lambda连接EC2本地MongoDB超时及公网IP连接失败求助

解决AWS Lambda连接EC2上MongoDB的超时问题

环境与现状

EC2实例上部署了MongoDB,已配置访问用户名和密码,EC2内部通过Node.js(Mongoose)连接数据库完全正常,代码如下:

const mongoose = require('mongoose');
let mongoUri = "mongodb://<username>:<password>@localhost:27017/db_name?authMechanism=DEFAULT&authSource=db_name"
module.exports = function() {
  mongoose
    .connect(mongoUri, {
      useNewUrlParser: true,
      useUnifiedTopology: true,
      useFindAndModify: false,
      useCreateIndex: true,
    })
    .then(() => console.log('Connected to MongoDB...'))
    .catch(error => console.log('Could not connect to MongoDB...', error));
}

Lambda连接配置

Lambda使用EC2私有IPv4地址连接MongoDB,代码如下:

const mongoose = require('mongoose');
module.exports = async function() {
  await mongoose
    .connect('mongodb://<username>:<password>@<ec2_private_ip4_address>:27017/db_name?authMechanism=DEFAULT&authSource=db_name')
    .then(() => console.log('Connected to MongoDB...'))
    .catch(error => console.log('Could not connect to MongoDB...', error));
}

为何使用私有IPv4而非公网IPv4?

公网IPv4无法在Lambda中连接MongoDB,但本地Mongo Compass等客户端可通过公网IPv4正常连接。

遇到的问题

连接成功后执行简单查询出现超时,错误日志:

2024-06-07T10:36:20.364Z d8bd2319-e7cb-4c04-93d4-8af6c9b14b11 Task timed out after 3.12 seconds
2024-06-07T10:36:20.364Z d8bd2319-e7cb-4c04-93d4-8af6c9b14b11 Task timed out after 3.12 seconds

解决方案

1. 排查网络连通性

  • 确保Lambda与EC2处于同一VPC,或已为Lambda配置VPC访问权限(需分配私有子网、安全组)
  • 检查EC2安全组:添加入站规则,允许Lambda所在安全组的流量访问27017端口
  • 检查VPC网络ACL:确保入站规则允许27017端口流量,出站规则允许Lambda返回流量

2. 优化Mongoose连接参数

给连接添加超时、连接池配置,避免无效等待和重复创建连接:

const mongoose = require('mongoose');
module.exports = async function() {
  try {
    await mongoose.connect('mongodb://<username>:<password>@<ec2_private_ip4_address>:27017/db_name?authMechanism=DEFAULT&authSource=db_name', {
      useNewUrlParser: true,
      useUnifiedTopology: true,
      serverSelectionTimeoutMS: 5000, // 连接超时时间
      socketTimeoutMS: 45000, // 数据传输超时时间
      poolSize: 5 // 连接池大小,适配Lambda并发
    });
    console.log('Connected to MongoDB...');
  } catch (error) {
    console.log('Could not connect to MongoDB...', error);
    throw error; // 抛出错误让Lambda处理流程中断
  }
}

3. 调整Lambda超时时间

当前Lambda超时仅3.12秒,无法满足查询耗时需求:在Lambda控制台中将超时时间调整至10-15秒(根据实际查询复杂度调整,最长支持15分钟)

4. 检查MongoDB绑定配置

确保MongoDB配置文件(mongod.conf)中bindIp设置为0.0.0.0或包含EC2私有IP,而非仅127.0.0.1,修改后重启MongoDB服务:

sudo systemctl restart mongod

5. 验证查询完整性

在Lambda中添加测试查询,确认连接成功后能正常获取数据,例如:

// 连接成功后执行测试查询
const TestModel = mongoose.model('Test', new mongoose.Schema({ name: String }));
const result = await TestModel.find().limit(1);
console.log('Query result:', result);

内容的提问来源于stack exchange,提问作者Tashen Jazbi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 17:25:20