MongoDB Atlas连接失败?AWS环境下的问题排查与解决
MongoDB Atlas连接AWS环境下的问题排查与解决
问题描述
使用MongoDB Atlas数据库,尝试通过Python进行数据存储与读取操作时无法建立连接,执行以下代码:
import pymongo client = pymongo.MongoClient("mongodb+srv://guest:guest@cluster0.oqhmaiq.mongodb.net/?retryWrites=true&w=majority") db = client["MyDB"] print(db.list_collection_names())
执行后终端卡顿数秒,抛出错误:
Traceback (most recent call last): File "mongo.py", line 5, in <module> print(db.list_collection_names()) File "/usr/local/lib64/python3.7/site-packages/pymongo/database.py", line 959, in list_collection_names return [result["name"] for result in self.list_collections(session=session, **kwargs)] File "/usr/local/lib64/python3.7/site-packages/pymongo/database.py", line 911, in list_collections return self.__client._retryable_read(_cmd, read_pref, session) File "/usr/local/lib64/python3.7/site-packages/pymongo/_csot.py", line 105, in csot_wrapper return func(self, *args, **kwargs) File "/usr/local/lib64/python3.7/site-packages/pymongo/mongo_client.py", line 1441, in _retryable_read server = self._select_server(read_pref, session, address=address) File "/usr/local/lib64/python3.7/site-packages/pymongo/mongo_client.py", line 1257, in _select_server server = topology.select_server(server_selector) File "/usr/local/lib64/python3.7/site-packages/pymongo/topology.py", line 272, in select_server server = self._select_server(selector, server_selection_timeout, address) File "/usr/local/lib64/python3.7/site-packages/pymongo/topology.py", line 261, in _select_server servers = self.select_servers(selector, server_selection_timeout, address) File "/usr/local/lib64/python3.7/site-packages/pymongo/topology.py", line 223, in select_servers server_descriptions = self._select_servers_loop(selector, server_timeout, address) File "/usr/local/lib64/python3.7/site-packages/pymongo/topology.py", line 240, in _select_servers_loop % (self._error_message(selector), timeout, self.description) pymongo.errors.ServerSelectionTimeoutError: ac-qymr9hr-shard-00-02.oqhmaiq.mongodb.net:27017: connection closed,ac-qymr9hr-shard-00-01.oqhmaiq.mongodb.net:27017: connection closed,ac-qymr9hr-shard-00-00.oqhmaiq.mongodb.net:27017: connection closed, Timeout: 30s, Topology Description: <TopologyDescription id: 638931405b2cf5e370bcbc8d, topology_type: ReplicaSetNoPrimary, servers: [<ServerDescription ('ac-qymr9hr-shard-00-00.oqhmaiq.mongodb.net', 27017) server_type: Unknown, rtt: None, error=AutoReconnect('ac-qymr9hr-shard-00-00.oqhmaiq.mongodb.net:27017: connection closed')>, <ServerDescription ('ac-qymr9hr-shard-00-01.oqhmaiq.mongodb.net', 27017) server_type: Unknown, rtt: None, error=AutoReconnect('ac-qymr9hr-shard-00-01.oqhmaiq.mongodb.net:27017: connection closed')>, <ServerDescription ('ac-qymr9hr-shard-00-02.oqhmaiq.mongodb.net', 27017) server_type: Unknown, rtt: None, error=AutoReconnect('ac-qymr9hr-shard-00-02.oqhmaiq.mongodb.net:27017: connection closed')>]>
原因分析(AWS环境下常见情况)
- IP白名单限制:MongoDB Atlas默认只允许特定IP访问,AWS实例的公网IP未加入Atlas的白名单列表,导致连接被拒绝。
- AWS安全组规则:运行Python代码的AWS资源(EC2、ECS等)的安全组未配置出向规则,不允许访问MongoDB Atlas的27017端口。
- 驱动版本不兼容:使用的pymongo版本过旧,与MongoDB Atlas的服务器版本不匹配,导致握手失败连接关闭。
- 凭证或权限问题:连接字符串中的用户名/密码错误,或者
guest用户没有访问MyDB数据库及执行list_collection_names的权限。 - 网络连通性问题:AWS环境到MongoDB Atlas的网络链路存在阻塞,比如VPC路由配置错误、NAT网关限制等。
解决步骤
配置MongoDB Atlas IP白名单
- 登录MongoDB Atlas控制台,进入目标集群的"Network Access"页面。
- 添加运行代码的AWS实例的公网IP;若使用VPC内网访问,配置VPC Peering连接Atlas的VPC与AWS的目标VPC。
- 保存配置后等待1-2分钟生效。
检查AWS安全组规则
- 找到运行代码的AWS资源对应的安全组,添加出向规则:
- 类型选择
Custom TCP,端口范围填27017,目标填0.0.0.0/0(或Atlas集群的IP段,更安全)。
- 类型选择
- 确保安全组的出向规则没有限制该端口的访问。
- 找到运行代码的AWS资源对应的安全组,添加出向规则:
升级pymongo驱动
- 在AWS实例上执行命令升级pymongo到兼容版本:
pip install --upgrade pymongo - 注意Python3.7需安装适配的pymongo版本(如pymongo 4.x系列部分版本支持3.7)。
- 在AWS实例上执行命令升级pymongo到兼容版本:
验证凭证与权限
- 确认连接字符串中的用户名
guest和密码guest正确无误。 - 在MongoDB Atlas控制台的"Database Access"页面,检查
guest用户是否拥有MyDB数据库的read或readWrite权限,若没有则添加对应权限。
- 确认连接字符串中的用户名
测试网络连通性
- 在AWS实例上执行以下命令测试端口是否可达:
nc -zv ac-qymr9hr-shard-00-00.oqhmaiq.mongodb.net 27017 - 若连接失败,排查AWS网络配置(如NAT网关、路由表、防火墙等)是否存在阻塞。
- 在AWS实例上执行以下命令测试端口是否可达:
内容的提问来源于stack exchange,提问作者Simon Lee
相关产品推荐
相关产品推荐

