首页 > 解决方案 > 使用 Java 连接池的 AWS IAM 数据库身份验证

问题描述

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

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

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

这是否在任何 Java 连接池中实现?或者你知道如何让它发挥作用吗?

标签: javaamazon-web-servicesamazon-rdsamazon-iam

解决方案


我还不得不使用 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 令牌过期的连接将停止工作。


推荐阅读