我不知道如何实现这一点。任何帮助和/或指针将不胜感激。
目前,我的Java/Spring应用后端部署在EC2上,并使用常规的Spring JDBC设置成功访问RDS上的MySQL。即在application.properties
中存储数据库信息,在**@Configuration类中配置DataSource
和JdbcTemplate
。一切正常。
现在,我需要在RDS上安全地访问MySQL。RDS示例已启用IAM身份验证。我还成功创建了IAM角色**,应用了内联策略。然后,按照AWS RDS文档和this link上的Java示例,我能够使用身份验证令牌和我创建的用户(而不是常规的数据库用户名和密码)从独立Java类成功访问数据库。这个独立的Java类直接处理“Connection”对象。
我卡住的地方是如何将其转换为Spring JDBC配置。也就是说,在我的@Configuration类中为此设置DataSource
和JdbcTemplate
bean。
什么是正确的/正确的方法来实现这一点?
-----编辑-开始-----
我正在尝试将其实现为一个可用于多个项目的库。也就是说,它将被用作JAR,并在项目的POM文件中声明为依赖项。此库将包括可配置的AWS服务,例如使用通用数据库用户名和密码的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
}
3条答案
按热度按时间olmpazwi1#
您可以使用以下代码片段替换SpringBoot/Tomcat提供的默认连接池。它将每10分钟刷新令牌密码,因为令牌的有效期为15分钟。此外,它假定可以从DNS主机名中提取区域。如果不是这种情况,则需要指定要使用的区域。
请注意,您需要导入Amazon的根/中间证书以建立可信连接。上面的示例代码假设证书已经导入到名为“rds-cacert”的文件中,并且在类路径上可用。或者,您也可以将它们导入JVM 'cacerts'文件。
要使用此数据源,您可以为Spring使用以下属性:
使用Spring Java配置:
上面需要MariaDB和AWS SDK库,并且需要类路径中的CA-bundle
cgvd09ve2#
更新至2023年!
现在,使用AWS JDBC Driver for MySQL对IAM数据库身份验证的支持,可以更轻松地实现这一点。我使用Sping Boot 3和spring-boot-starter-jdbc测试了这个配置。
添加以下依赖项:
将以下内容添加到application.yml:
它应该只是工作!
驱动程序使用AWS default credentials provider chain,因此请确保您具有策略凭据,允许在任何运行应用程序的位置访问IAM DB。如果你还在使用故障转移支持,请确保阅读github上的所有驱动程序文档。希望这个更新能帮助到其他人!
*这是使用MariaDB驱动程序的旧方法-请参阅上面的更新!
我知道这是一个老问题,但经过一些搜索,我发现一个非常简单的方法,你现在可以使用MariaDB驱动程序来做到这一点。在2.5版本中,他们向驱动程序添加了AWS IAM credential plugin。它将自动处理令牌的生成、缓存和刷新。
我已经使用Sping Boot 2.3和默认的HikariCP连接池进行了测试,在这些设置下,它对我来说工作得很好:
下载rds-combined-ca-bundle.pem并将其放在
src/main/resources
中,以便您可以通过SSL连接。在类路径上还需要这些依赖项:
该驱动程序使用标准
DefaultAWSCredentialsProviderChain
,因此请确保您具有允许IAM DB访问的策略凭据,无论您在何处运行应用程序。希望这对其他人有帮助-我在网上找到的大多数例子都涉及自定义代码,后台线程等-但是使用新的驱动程序功能要容易得多!
yquaqz183#
有一个图书馆可以让这一切变得容易。实际上,您只需覆盖HikariDataSource中的getPassword()方法。您使用STS承担角色并发送该角色的“密码”。