繁体   English   中英

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

[英]AWS IAM Database Authentication using Java connection pool

我正在寻找一个 Java 数据库连接池,它允许我对我的 Aurora MySQL 使用 AWS IAM 数据库身份验证。 该池应该可以在 Tomcat 的 context.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

我建议你做一个项目 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 分钟

祝你好运。

我知道这是一个较旧的问题,但经过一番搜索后,我发现了一种非常简单的方法,您现在可以使用 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 分钟)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM