部署在EC2的Spring Boot应用连接AWS DocumentDB超时问题
解决EC2到同一VPC内DocumentDB的连接超时问题
优先排查网络与安全组配置
- 检查DocumentDB安全组规则:确保DocumentDB的安全组(
sg-056d8***75f70ff1)入站规则允许EC2实例的流量访问27017端口。
操作步骤:进入AWS控制台的DocumentDB集群页面,找到对应安全组,编辑入站规则,添加自定义TCP规则,端口设为27017,来源选择EC2实例的安全组ID,或者EC2的私有IP段。 - 验证EC2出站规则:确认EC2实例的安全组允许出站访问27017端口(默认全出站规则可跳过此步)。
- 测试端口连通性:在EC2实例上执行以下命令,直接验证网络连通性:
若连接失败,说明网络层面存在阻塞,需进一步检查VPC路由表(确保同VPC内路由正常)和网络ACL(无拒绝流量的规则)。# 使用telnet测试 telnet mongodb.ceupui6czrsm.us-east-1.docdb.amazonaws.com 27017 # 或使用nc命令 nc -zv mongodb.ceupui6czrsm.us-east-1.docdb.amazonaws.com 27017
修复证书加载逻辑
你的代码通过类加载器读取证书,但证书文件放在EC2实例的jar包同目录,类加载器默认读取jar内部资源,会导致证书找不到(可能掩盖真实的SSL握手问题,表现为超时)。修改证书读取逻辑为直接读取本地文件:
private static X509Certificate createCertificate() throws Exception { final CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); File certFile = new File(SSL_CERTIFICATE); if (!certFile.exists()) { throw new Exception("SSL证书文件不存在:" + SSL_CERTIFICATE); } try (FileInputStream is = new FileInputStream(certFile)) { return (X509Certificate) certFactory.generateCertificate(is); } }
也可以将证书打包到jar的resources目录下,保持原类加载器读取逻辑。
修正代码配置错误
- 连接池配置写法错误:原代码中
applyToConnectionPoolSettings未正确修改配置,应改为:.applyToConnectionPoolSettings(connPoolBuilder -> connPoolBuilder.maxSize(1) ) - 延长连接超时时间:当前socket连接超时为10秒,可适当延长至30秒:
.applyToSocketSettings(builder -> builder.connectTimeout(30, TimeUnit.SECONDS) ) - 核对用户名拼写:注意到配置的用户名为
admininstrator(多了一个i),确认DocumentDB的实际用户名是否一致,避免认证失败导致的连接异常。
其他排查点
- 确认DocumentDB实例状态为
available,无维护或重启操作。 - 检查VPC子网配置,确保EC2与DocumentDB所在子网的路由策略允许同AZ内实例通信。
内容的提问来源于stack exchange,提问作者user2287094
相关产品推荐
相关产品推荐

