VPC内AWS Lambda连接EC2上MongoDB失败求助
当前状态
- 已在VPC内的EC2实例上成功部署MongoDB社区版,实例为运行Ubuntu系统的单节点,未使用Atlas集群
- 数据库运行正常,已完成绑定配置,可从Windows机器正常连接、浏览数据库
- 已在同一VPC内创建Lambda函数
- 尝试用猜测的连接字符串
mongodb+srv://user@ec2-54-xxx.compute-1.amazonaws.com建立连接,无相关文档参考 - 收到错误:
querySrv ENOTFOUND _mongodb._tcp.ec2-54-xxx.compute-1.amazonaws.com
需求帮助
- 是否可以实现Lambda连接运行MongoDB的EC2单实例?
- 若可以,应使用何种连接字符串?
- 是否需要改用弹性IP?
代码片段(NodeJS,连接失败与语言无关)
import { MongoClient } from 'mongodb' const client = new MongoClient('mongodb+srv://user@ec2-54-xxx.compute-1.amazonaws.com'); await client.connect()
解决方案
1. 能否连接?
完全可以。Lambda和EC2在同一VPC内,只要网络配置(安全组、NACLs)允许双向通信,就能建立连接。
2. 正确的连接字符串
你用的mongodb+srv://是MongoDB Atlas集群专用格式,依赖SRV DNS记录,而你的单实例EC2没有配置这类记录,所以才会报querySrv错误。单实例应该用标准连接格式:
// 格式:mongodb://用户名:密码@EC2私有IP/目标数据库名?authSource=认证数据库 const client = new MongoClient('mongodb://user:your-password@10.x.x.x:27017/your-db?authSource=admin');
- 优先用EC2私有IP(比如
10.x.x.x),同一VPC内通信更稳定,无需公网IP - 也可以用EC2私有DNS(如
ip-10-x-x-x.ec2.internal),AWS会自动解析到私有IP - 默认端口是27017,要确保EC2安全组允许Lambda的安全组访问这个端口
- 替换
your-password、your-db为实际信息,authSource=admin是指定用户认证的数据库(如果你的用户是在admin库创建的)
3. 是否需要弹性IP?
不需要。同一VPC内用私有IP或私有DNS就能通信,弹性IP是公网IP,仅用于公网访问场景,这里完全没必要。从安全角度,单实例MongoDB也不建议暴露公网。
额外检查项
- EC2安全组:入站规则允许Lambda所在安全组访问27017端口;出站规则允许EC2向VPC内发送流量(默认全通即可)
- MongoDB配置:确保
mongod.conf里的bindIp设置为0.0.0.0或EC2私有IP,不要只绑定127.0.0.1(否则只能本地访问) - Lambda配置:确认Lambda已开启VPC访问权限,子网、安全组设置正确
内容的提问来源于stack exchange,提问作者kiwichris
相关产品推荐
相关产品推荐

