使用Java连接池的AWS IAM数据库身份验证

时间:2018-05-08 13:43:50

标签: java amazon-web-services amazon-rds amazon-iam

我正在寻找一个允许我为Aurora MySQL使用AWS IAM数据库身份验证的Java数据库连接池。该池应该能够处理Tomcat context.xml文件。

我查看了Tomcat DBCP,dbcp2,HikariCP和c3p0。但他们似乎都认为用户名和密码在应用程序启动时是已知的,并且在应用程序的生命周期内不会发生变化。

对于IAM数据库身份验证,凭据每15分钟更改一次,因此每当创建新连接时,池都需要向AWS IAM请求新凭据(凭证可以缓存几分钟。)。

这是在任何Java连接池中实现的吗?或者您对如何使其发挥作用有所了解?

2 个答案:

答案 0 :(得分:0)

最近我遇到了同样的问题。...我使用HikariCP连接池,直到现在它还不支持此连接池。幸运的是,我使用此工具找到了PR:

https://github.com/brettwooldridge/HikariCP/pull/1335

我建议您制作一个项目fork并使用它,直到官方存储库接受此PR。

我的实现:

public DataSource setup() throws Exception {
Supplier<String> passwordSupplier = () -> {
    return this.generateAuthToken(host, port, user);
}; 
com.zaxxer.hikari.HikariDataSource dataSource = new com.zaxxer.hikari.HikariDataSource();
dataSource.setPasswordSupplier(passwordSupplier); ...

在您的池配置中包括以下内容非常重要:

dataSource.setMaxLifetime(15 * 60 * 1000); 

因为您的池连接使用RDS Iam Auth的时间不能超过15分钟

祝你好运。

答案 1 :(得分:0)

我知道这是一个比较老的问题,但是经过一番搜索,我发现了一个非常简单的方法,您现在可以使用MariaDB驱动程序进行此操作。在版本2.5中,他们向驱动程序添加了AWS IAM credential plugin。它将自动处理令牌的生成,缓存和刷新。您可以这样激活它:

jdbc:mariadb://host/db?credentialType=AWS-IAM&useSsl&serverSslCert=/somepath/rds-combined-ca-bundle.pem

我已经使用HikariCP连接池进行了测试,并且对我有用。确保您使用的是MariaDB驱动程序(不是MySQL),并将maxLifetime设置为600000ms(驱动程序将令牌缓存10分钟)。

希望这对其他人有帮助-我在网上发现的大多数示例都涉及自定义代码,后台线程等-但使用新的驱动程序功能要容易得多!