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



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

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

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

这是否在任何 Java 连接池中实现?或者你对如何让它工作有一个想法吗?

我也不得不使用node js lambda和MySql RDS来面对这个问题。我们使用的是 mysql 连接池,因此我们实施了一个解决方案,该解决方案创建了一个未来的日期时间,我们可以检查每当从池请求连接时连接是否即将过期。此日期时间为 15 分钟减去连接池初始化后的一些抖动。

因此,获取连接池(获取连接(如下所示:

const getPool = async (): Promise<DbConnectionPool> => {
if (isRdsIamTokenCloseToExpiring()) {
await poolHolder.lock.acquire();
try {
// if, after having acquired lock, thread pool is still about to expire...    
if (isRdsIamTokenCloseToExpiring()) {     
await closeConnectionsInPool();
await initializeConnectionPool();
}
} finally {
poolHolder.lock.release();
}
}
if (!poolHolder.pool) {
throw new Error('pool holder is null - this should never happen');
} else {
return poolHolder.pool;
}
};

因为我们有多个并发异步线程试图获得连接,所以我们不得不引入一个信号量来控制池重新初始化。总而言之,这样做比使用用户名和密码更麻烦,但它更安全。

为了回答 Isen Ng 上面的评论(我没有代表直接回答(,RDS IAM 令牌过期的连接将停止工作。

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

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

我建议您制作一个项目分支并使用它,直到官方仓库接受此 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 身份验证时,池连接的生存时间不能超过 15 分钟

祝你好运。

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新