有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用IAM身份验证和Spring JDBC(数据源和JdbcTemplace)访问AWS RDS

我不知道如何实现这一点。任何帮助和/或建议都将不胜感激

目前,我的Java/Spring应用后端部署在EC2上,并使用常规的Spring JDBC设置成功访问RDS上的MySQL。也就是说,将数据库信息存储在application.properties中,并在@Configuration类中配置DataSourceJdbcTemplate。一切正常

现在,我需要在RDS上安全地访问MySQL。RDS实例已启用IAM身份验证。我还成功创建了IAM角色,并应用了内联策略。然后,按照AWS RDS文档和this link上的Java示例,我能够使用身份验证令牌和我创建的用户(而不是常规的db用户名和密码)从独立Java类成功访问数据库。这个独立的Java类直接处理“连接”对象

我陷入困境的地方是如何将其转换为Spring JDBC配置。也就是说,在@Configuration类中为此设置DataSourceJdbcTemplatebean

实现这一点的正确/正确方法是什么

----编辑-开始---

我试图将其实现为一个可用于多个项目的库。也就是说,它将被用作JAR,并在项目的POM文件中声明为依赖项。该库将包括可配置的AWS服务,如使用通用DB用户名和密码的RDS访问、使用IAM身份验证的RDS访问、用于数据加密的KMS(CMK/数据密钥)等

其想法是根据项目在任何web/app服务器上使用该库

希望这能澄清我的需求

----编辑-结束---

DataSource内部有getConnection(),所以我基本上可以创建自己的DataSource实现来实现我想要的。但这是一个好方法吗

比如:

public class MyDataSource implements DataSource {
    @Override
    public Connection getConnection() throws SQLException {
        Connection conn = null;
        // get a connection using IAM Authentication Token for accessing AWS RDS, etc. as in the AWS docs
        return conn;
    }

    @Override
    public Connection getConnection(String username, String password) throws SQLException {
        return getConnection();
    }

    //other methods
} 

共 (1) 个答案

  1. # 1 楼答案

    我知道这是一个比较老的问题,但经过一番搜索,我找到了一种非常简单的方法,现在可以使用MariaDB驱动程序来实现这一点。在版本2.5中,他们在驱动程序中添加了一个AWS IAM credential plugin。它将自动处理令牌的生成、缓存和刷新

    我已经使用Spring Boot 2.3和默认的HikariCP连接池进行了测试,这些设置对我来说很好:

    spring.datasource.url=jdbc:mariadb://host/db?credentialType=AWS-IAM&useSsl&serverSslCert=classpath:rds-combined-ca-bundle.pem
    spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
    spring.datasource.username=iam_username
    #spring.datasource.password=dont-need-this
    spring.datasource.hikari.maxLifetime=600000
    

    下载rds-combined-ca-bundle.pem并将其放在src/main/resources中,这样您就可以通过SSL进行连接
    在类路径上也需要这些依赖项:

    runtime 'org.mariadb.jdbc:mariadb-java-client'
    runtime 'com.amazonaws:aws-java-sdk-rds:1.11.880'
    

    驱动程序使用标准的DefaultAWSCredentialsProviderChain,因此确保您拥有允许IAM DB访问的策略凭据,无论您在哪里运行应用程序

    希望这对其他人有所帮助——我在网上找到的大多数例子都涉及自定义代码、后台线程等——但使用新的驱动程序功能要容易得多