java使用IAM身份验证和Spring JDBC(数据源和JdbcTemplace)访问AWS RDS
我不知道如何实现这一点。任何帮助和/或建议都将不胜感激
目前,我的Java/Spring应用后端部署在EC2上,并使用常规的Spring JDBC设置成功访问RDS上的MySQL。也就是说,将数据库信息存储在application.properties
中,并在@Configuration类中配置DataSource
和JdbcTemplate
。一切正常
现在,我需要在RDS上安全地访问MySQL。RDS实例已启用IAM身份验证。我还成功创建了IAM角色,并应用了内联策略。然后,按照AWS RDS文档和this link上的Java示例,我能够使用身份验证令牌和我创建的用户(而不是常规的db用户名和密码)从独立Java类成功访问数据库。这个独立的Java类直接处理“连接”对象
我陷入困境的地方是如何将其转换为Spring JDBC配置。也就是说,在@Configuration类中为此设置DataSource
和JdbcTemplate
bean
实现这一点的正确/正确方法是什么
----编辑-开始---
我试图将其实现为一个可用于多个项目的库。也就是说,它将被用作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 楼答案
我知道这是一个比较老的问题,但经过一番搜索,我找到了一种非常简单的方法,现在可以使用MariaDB驱动程序来实现这一点。在版本2.5中,他们在驱动程序中添加了一个AWS IAM credential plugin。它将自动处理令牌的生成、缓存和刷新
我已经使用Spring Boot 2.3和默认的HikariCP连接池进行了测试,这些设置对我来说很好:
下载rds-combined-ca-bundle.pem并将其放在
src/main/resources
中,这样您就可以通过SSL进行连接在类路径上也需要这些依赖项:
驱动程序使用标准的
DefaultAWSCredentialsProviderChain
,因此确保您拥有允许IAM DB访问的策略凭据,无论您在哪里运行应用程序希望这对其他人有所帮助——我在网上找到的大多数例子都涉及自定义代码、后台线程等——但使用新的驱动程序功能要容易得多