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
相关产品推荐
相关产品推荐

