Spring Boot应用连接AWS DocumentDB失败,请求排查问题原因
Spring Boot 连接 AWS DocumentDB 问题排查方案
1. 依赖版本冲突
你的 pom.xml 中存在多组版本不一致的 MongoDB 驱动依赖,这会引发兼容性问题:
spring-boot-starter-data-mongodb已经自带适配 Spring Boot 2.7.0 的 MongoDB 驱动,但你额外引入了mongo-java-driver:3.12.10、mongodb-driver-sync:4.4.1、mongodb-driver-core:3.11.2,这些版本之间存在严重的版本不匹配,会导致连接逻辑异常。
修复方案:
移除所有手动添加的 MongoDB 驱动依赖,仅保留 spring-boot-starter-data-mongodb,让 Spring Boot 自动管理依赖版本:
<!-- 删除以下冗余依赖 --> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>3.12.10</version> </dependency> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver-sync</artifactId> <version>4.4.1</version> </dependency> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver-core</artifactId> <version>3.11.2</version> </dependency>
2. 证书文件格式错误
Java 的 javax.net.ssl.trustStore 无法直接加载 .pem 格式的证书,它要求使用 JKS 或 PKCS12 格式的密钥库文件。你当前直接将 .pem 文件路径设置为 trustStore,会导致 SSL 握手失败(本地运行的错误日志应为 PKIX 路径构建失败)。
修复方案:
将 AWS DocumentDB 的 .pem 证书转换为 PKCS12 格式的密钥库:
openssl pkcs12 -export -in global-bundle.pem -out docdb-truststore.p12 -name "docdb-cert" -password pass:changeit
将转换后的 docdb-truststore.p12 放入 src/main/resources 目录,再修改配置与代码。
3. 证书路径配置问题
- 本地运行时使用绝对路径
/xdrs_data_service_api/src/main/resources/global-bundle.pem,该路径仅在你的开发环境有效,切换环境后会失效; - ECS 容器中不存在这个路径,直接导致证书文件无法读取(ECS 错误日志应为文件不存在或无法访问)。
修复方案:
在 application.properties 中使用 classpath: 前缀加载证书:
documentdb.pemFile=classpath:docdb-truststore.p12
同时修改代码,通过 ResourceLoader 读取 classpath 下的文件:
@Autowired private ResourceLoader resourceLoader; @Bean public MongoClient mongoClient() throws Exception { Resource resource = resourceLoader.getResource(pemFile); File keystoreFile = resource.getFile(); System.setProperty("javax.net.ssl.trustStore", keystoreFile.getAbsolutePath()); System.setProperty("javax.net.ssl.trustStorePassword", "changeit"); System.setProperty("javax.net.ssl.trustStoreType", "PKCS12"); // 指定密钥库类型 // 其余连接逻辑保持不变 }
4. SSL 上下文配置优化
直接依赖 SSLContext.getDefault() 可能无法正确加载自定义信任库,建议显式初始化 SSL 上下文:
@Bean public MongoClient mongoClient() throws Exception { Resource resource = resourceLoader.getResource(pemFile); char[] password = "changeit".toCharArray(); KeyStore trustStore = KeyStore.getInstance("PKCS12"); try (InputStream is = resource.getInputStream()) { trustStore.load(is, password); } TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init(trustStore); SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom()); ConnectionString connString = new ConnectionString(connectionString); MongoClientSettings settings = MongoClientSettings.builder() .applyToSslSettings(sslSettingsBuilder -> sslSettingsBuilder.enabled(true).context(sslContext)) .applyConnectionString(connString) .build(); return MongoClients.create(settings); }
这种方式无需依赖系统属性,能更可靠地加载证书。
5. 网络与权限检查
部署到 ECS Fargate 时,必须确认以下配置:
- DocumentDB 集群的安全组允许来自 ECS 任务所在安全组的 TCP 27017 端口入站流量;
- ECS 任务与 DocumentDB 集群处于同一 VPC,或通过 VPC 对等连接、中转网关等方式连通;
- DocumentDB 集群的访问控制列表(ACL)允许 ECS 任务的 IP 地址或 VPC CIDR 访问;
- 连接字符串中的用户名、密码正确,且该用户拥有目标数据库的访问权限。
内容的提问来源于stack exchange,提问作者Shubham CSE
相关产品推荐
相关产品推荐

