插件窝 干货文章 将 AWS RDS 连接到 Spring Boot

将 AWS RDS 连接到 Spring Boot

datasource Spring 配置 数据库 1010    来源:    2025-03-30

将 AWS RDS 连接到 Spring Boot 应用

准备工作

  1. 创建 AWS RDS 实例

    • 登录 AWS 控制台
    • 导航到 RDS 服务
    • 创建适合您需求的数据库实例(MySQL, PostgreSQL, Oracle等)
    • 记录下端点(Endpoint)、端口、数据库名称、用户名和密码
  2. 配置安全组

    • 确保您的 RDS 实例的安全组允许来自 Spring Boot 应用所在环境的连接(通常是 EC2 实例或本地开发机的 IP)

Spring Boot 配置

1. 添加数据库驱动依赖

根据您选择的数据库类型,在 pom.xmlbuild.gradle 中添加相应依赖:

MySQL 示例(Maven):

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

PostgreSQL 示例(Maven):

<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <scope>runtime</scope>
</dependency>

2. 配置 application.properties 或 application.yml

application.properties 示例(MySQL):

spring.datasource.url=jdbc:mysql://your-rds-endpoint:3306/your-database-name
spring.datasource.username=your-username
spring.datasource.password=your-password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# HikariCP 连接池配置(可选)
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.max-lifetime=2000000
spring.datasource.hikari.connection-timeout=30000

application.yml 示例(PostgreSQL):

spring:
  datasource:
    url: jdbc:postgresql://your-rds-endpoint:5432/your-database-name
    username: your-username
    password: your-password
    driver-class-name: org.postgresql.Driver
    hikari:
      maximum-pool-size: 10
      minimum-idle: 5
      idle-timeout: 30000
      max-lifetime: 2000000
      connection-timeout: 30000

3. 使用 Spring Data JPA(可选)

如果您想使用 JPA,添加以下依赖并配置:

Maven:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

JPA 配置(application.properties):

spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

高级配置

1. 使用 AWS Secrets Manager(推荐用于生产环境)

  1. 将数据库凭据存储在 AWS Secrets Manager 中
  2. 添加 AWS SDK 依赖:
<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>secretsmanager</artifactId>
</dependency>
  1. 创建配置类从 Secrets Manager 获取凭据:
@Configuration
public class AwsSecretsManagerConfig {

    @Value("${aws.secretsmanager.secret-name}")
    private String secretName;

    @Bean
    public DataSource dataSource() {
        SecretsManagerClient client = SecretsManagerClient.create();
        GetSecretValueRequest request = GetSecretValueRequest.builder()
                .secretId(secretName)
                .build();
        GetSecretValueResponse response = client.getSecretValue(request);

        // 解析JSON格式的secret
        String secret = response.secretString();
        JsonNode jsonNode = new ObjectMapper().readTree(secret);

        HikariDataSource dataSource = new HikariDataSource();
        dataSource.setJdbcUrl(jsonNode.get("url").asText());
        dataSource.setUsername(jsonNode.get("username").asText());
        dataSource.setPassword(jsonNode.get("password").asText());

        return dataSource;
    }
}

2. 使用 IAM 数据库认证(仅限 MySQL 和 PostgreSQL)

  1. 在 RDS 中启用 IAM 数据库认证
  2. 配置 IAM 策略允许获取临时凭证
  3. 使用 AWS SDK 生成临时凭证:
public class IamAuthTokenGenerator {

    public static String generateAuthToken(String region, String hostname, 
                                         int port, String username) {
        RdsIamAuthTokenGenerator generator = RdsIamAuthTokenGenerator.builder()
                .credentials(DefaultCredentialsProvider.create())
                .region(Region.of(region))
                .build();

        return generator.getAuthToken(
                GetIamAuthTokenRequest.builder()
                        .hostname(hostname)
                        .port(port)
                        .userName(username)
                        .build());
    }
}

然后在数据源配置中使用生成的令牌作为密码。

故障排除

  1. 连接超时

    • 检查安全组设置
    • 验证网络连通性(尝试从应用环境 telnet 到 RDS 端点)
    • 检查 VPC 配置(如果是跨 VPC 连接)
  2. 认证失败

    • 验证用户名/密码
    • 检查数据库用户权限
    • 对于 IAM 认证,检查 IAM 策略
  3. 性能问题

    • 调整连接池设置
    • 考虑启用 RDS 性能洞察
    • 检查数据库实例大小是否足够

最佳实践

  1. 生产环境中不要将凭据硬编码在配置文件中
  2. 使用连接池(如 HikariCP)
  3. 为不同环境(dev, staging, prod)使用不同的 RDS 实例
  4. 定期轮换凭据
  5. 启用 RDS 的自动备份和监控
  6. 考虑使用只读副本分担读负载

通过以上步骤,您应该能够成功将 Spring Boot 应用连接到 AWS RDS 数据库。