You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 21:42:02