0

我有一个带有 postgres 的 RDS 实例,我通过 IAM 用户进行身份验证。密码是每 15 分钟刷新一次的令牌:


    authToken, err := rdsutils.BuildAuthToken(Endpoint, "mars-east-4", "iamuser", envCredentials)
    if err != nil {
        return "", err
    }

但是,我已经看到令牌过期后连接池引发身份验证错误的问题,并且我没有找到任何好的方法。

我在想的是创建一个函数GetPool并将其注入到我的存储库中,这个函数将返回一个 Pool 对象pgxpool.Pool

func (p Pool) GetPool() (*pgxpool.Pool, error) {
    config, err := p.getConfig()
    if err != nil {
        return nil, err
    }

    pool, err := pgxpool.ConnectConfig(context.Background(), config)
    if err != nil {
        return nil, err
    }

    return pool, nil
}

getConfig内部将调用BuildAuthToken,但仅每 15 分钟一次(伪代码):

if time > 15minutes {
  return BuildAuthToken()
}

因此,如果 15 分钟过去了,我将重新感染令牌,否则我将使用我已经拥有的令牌。这将是最终的解决方案

func (p Pool) GetPool() (*pgxpool.Pool, error) {
    // Pseudocode
    if p.time < 15minutes {
      return p.Pool, nil
    }

    config, err := p.getConfig()
    if err != nil {
        return nil, err
    }

    pool, err := pgxpool.ConnectConfig(context.Background(), config)
    if err != nil {
        return nil, err
    }

    p.Pool = pool
    p.time = time.Now()
    return pool, nil
}

那么这种方法效率低吗?有更好的方法吗?谢谢

4

0 回答 0