You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Spring MVC连接AWS DocumentDB失败求助(原EC2 MongoDB正常)

我之前帮团队处理过类似MongoDB迁移到DocumentDB的连接问题,结合你的技术栈版本,核心问题应该是没适配DocumentDB的强制SSL要求和认证机制,给你整理了针对性的解决方案:

解决DocumentDB连接问题的关键调整

1. 强制开启SSL连接

AWS DocumentDB默认要求所有连接使用SSL加密,你的原有代码完全没配置SSL选项,这是连接失败的核心原因之一。需要通过MongoClientOptions开启SSL:

@Bean
public MongoDbFactory mongoDbFactory() throws UnknownHostException {
    // 配置SSL连接选项
    MongoClientOptions options = MongoClientOptions.builder()
        .sslEnabled(true)
        .sslInvalidHostNameAllowed(true) // 若遇到主机名与证书不匹配的问题可开启,AWS官方证书通常无需此配置
        .build();

    // 构建带SSL的MongoClient
    MongoClient mongoClient = new MongoClient(
        new ServerAddress(env.getProperty("mongo.database.host"), Integer.parseInt(env.getProperty("mongo.database.port"))),
        options
    );

    return new SimpleMongoDbFactory(mongoClient, env.getProperty("mongo.database.name"));
}

2. 添加DocumentDB认证信息

DocumentDB必须通过用户名密码认证访问,你的原有代码缺少认证配置,需要补充MongoCredential

import java.util.Arrays;
import com.mongodb.MongoCredential;

@Bean
public MongoDbFactory mongoDbFactory() throws UnknownHostException {
    // 从配置文件读取认证信息
    String username = env.getProperty("mongo.database.username");
    String password = env.getProperty("mongo.database.password");
    String dbName = env.getProperty("mongo.database.name");

    // 创建认证凭证
    MongoCredential credential = MongoCredential.createCredential(
        username,
        dbName,
        password.toCharArray()
    );

    // 配置SSL选项
    MongoClientOptions options = MongoClientOptions.builder()
        .sslEnabled(true)
        .build();

    // 构建带认证和SSL的MongoClient
    MongoClient mongoClient = new MongoClient(
        new ServerAddress(env.getProperty("mongo.database.host"), Integer.parseInt(env.getProperty("mongo.database.port"))),
        Arrays.asList(credential),
        options
    );

    return new SimpleMongoDbFactory(mongoClient, dbName);
}

3. 确认版本兼容性

你的技术栈版本是兼容的:Spring Data MongoDB 1.10.14对应的Mongo Java Driver支持范围是3.2.x~3.6.x,你用的3.5.0正好在这个区间内,不需要调整版本,只要确保依赖没有冲突即可。

额外排查点

  • 检查EC2实例与DocumentDB是否在同一VPC,且安全组配置允许EC2访问DocumentDB的27017端口;
  • 若遇到证书信任问题,可下载AWS官方的DocumentDB证书导入JVM信任存储,或在代码中指定证书路径:
System.setProperty("javax.net.ssl.trustStore", "/path/to/rds-combined-ca-bundle.pem");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

(通常默认JVM信任存储已包含AWS根证书,此步骤大概率不需要)

内容的提问来源于stack exchange,提问作者Mansi Joshi

火山引擎 最新活动