Lambda无法连接EC2上的MongoDB:权限配置问题排查求助
排查Lambda连接EC2上MongoDB的问题
你已经把基础配置都落实了,咱们一步步揪出问题所在:
1. 先把安全组的细节再核对一遍
- 确认EC2安全组的入站规则里,源地址是
my-lambda-sg的安全组ID,别是手动输错的IP段(复制ID的时候很容易多打或少打字符)。 - 检查MongoDB的端口是否匹配:默认是27017,如果你改了端口,入站规则的端口要和MongoDB配置完全一致。
- 别忘了看
my-lambda-sg的出站规则:默认是允许所有出站流量,但如果有自定义限制,得确保放行MongoDB的端口(TCP 27017或你用的自定义端口)。
2. 先测网络连通性,再碰MongoDB
在Lambda里加一段简单的测试代码,先不连MongoDB,直接测能不能通EC2的私有IP和对应端口(Lambda在VPC里默认禁用ping,所以用nc工具测端口):
import subprocess def lambda_handler(event, context): # 替换成你的EC2私有IP和MongoDB端口 ec2_ip = "10.0.1.10" mongodb_port = "27017" try: # 用nc测试端口连通性 result = subprocess.run( ["nc", "-zv", ec2_ip, mongodb_port], capture_output=True, text=True, timeout=5 ) return { 'statusCode': 200, 'body': f"端口测试结果: {result.stdout} {result.stderr}" } except Exception as e: return { 'statusCode': 500, 'body': f"连接失败: {str(e)}" }
运行这段测试,如果返回端口不通,那就是网络层的问题;如果能通,再去排查MongoDB本身的配置。
3. 检查MongoDB的绑定设置
登录EC2,打开MongoDB的配置文件(一般是/etc/mongod.conf),找net.bindIp这一项:
- 如果设成了
127.0.0.1,那MongoDB只允许本地访问,得改成0.0.0.0或者EC2的私有IP,才能接受VPC内其他资源的连接。 - 修改完配置记得重启MongoDB:
sudo systemctl restart mongod
4. 再核对Lambda的VPC配置细节
- 确认Lambda选的子网是EC2所在的子网(不管公有还是私有,只要在同一个VPC,路由表有本地路由就行)。
- 检查子网的IP池有没有耗尽:如果子网里可用IP太少,Lambda可能拿不到私有IP,导致连不上。
- 不用纠结NAT网关:Lambda连接VPC内的EC2不需要公网,只要子网的路由表里有VPC本地路由(默认都有,比如
10.0.0.0/16指向本地)就行。
5. 确认IAM角色的权限没踩坑
虽然你加了AWSLambdaVPCAccessExecutionRole,还是要核对:
- 角色的信任关系是不是允许
lambda.amazonaws.com作为信任实体(默认创建的角色是对的,但如果手动改过可能出问题)。 - 有没有其他自定义权限策略不小心限制了Lambda的VPC操作?比如拒绝了
ec2:CreateNetworkInterface这类必要权限。
6. 翻日志找线索
- Lambda的CloudWatch日志:看函数执行时的具体错误,是“连接超时”还是“认证失败”,直接指向问题根源。
- MongoDB的日志(一般在
/var/log/mongodb/mongod.log):找有没有来自Lambda私有IP的连接尝试记录,如果有拒绝信息,会明确说原因(比如IP限制、用户名密码错了)。
最后:别忘了MongoDB的认证设置
如果MongoDB开了认证,得确保Lambda连接代码里的用户名、密码是对的,而且这个用户有允许从Lambda所在IP访问的权限(MongoDB可以给用户绑定IP限制)。
内容的提问来源于stack exchange,提问作者pellyadolfo
相关产品推荐
相关产品推荐

