3

我将node-mysql2 库与AWS.RDS.signer结合使用。

我有以下函数,它为重用连接创建了一个连接池:

const createPool = () => new Promise((resolve, reject) => {
    signer.getAuthToken({
        region: '...',
        hostname: '...',
        port: '...',
        username: '...'
    }, (err, token) => {
        if (err) reject(err)
        const pool = mysql.createPool({
            host: '...',
            port: '...',
            user: '...',
            database: '...',
            password: token,
            ssl: 'Amazon RDS'
            authSwitchHandler: (data, cb) => {
                if (data.pluginName === 'mysql_clear_password') cb(null, Buffer.from(token + '\0'))
            }
        })
        resolve(pool)
    })
})

它工作得很好......一段时间。然后我突然开始收到这个错误:

错误:用户 '...'@'...' 的访问被拒绝(使用密码:是)

所以,我认为正在发生的事情是,aws 签名者返回的令牌仅在短时间内有效,不能用于在池中不断地重新建立连接。

我可以看到,无法使用 aws sdk 配置 rds 令牌的 ttl。因此,我能想到的唯一其他选择是以某个固定间隔完全结束并重新创建池。

我想知道是否有人可能已经为此苦苦挣扎,并且谁可能对解决此问题的最佳方法有所了解?有没有更好的方法将 rds 签名器与连接池结合使用?

4

2 回答 2

2

对于 node-mysql2 版本 >= 2.0.0

mysql.createPool({
    ...,
    ssl: 'Amazon RDS',
    authPlugins: {
        mysql_clear_password: () => () =>
            signer.getAuthToken({
                region: '...',
                hostname: '...',
                port: '...',
                username: '...'
            })
    }
});

对于 node-mysql2 版本 < 2.0.0

mysql.createPool({
    ...,
    ssl: 'Amazon RDS',
    authSwitchHandler: (data, cb) => {
        if (data.pluginName === 'mysql_clear_password') {
            signer.getAuthToken({
                    region: '...',
                    hostname: '...',
                    port: '...',
                    username: '...'
                },
                (err, token) => {
                    if (err) {
                        cb(err);
                    } else {
                        cb(null, Buffer.from(token + '\0'));
                    }
                }
            );
        } else {
            cb(new Error(`Authentication method ${data.pluginName} is not supported`));
        }
    }
});

另见https://github.com/sidorares/node-mysql2/issues/1017

于 2020-02-01T02:02:05.470 回答
0

这是一条评论。

亚马逊已经计划了很长一段时间来更改他们的 RDS 证书,至少对于 mySQL。

如果您的 RDS 服务器已经如此升级(亚马逊显然将在 2020 年 6 月完成)并且正在运行旧版本的 mySQL (<=5.6),那么在尝试 IAM 令牌登录时,您可能会收到错误消息:

Error: 139965154551680:error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol:../deps/openssl/openssl/ssl/statem/statem_lib.c:1929:

为了解决这个问题,如果您使用的是 NodeJS 12+,请使用 --tls-min-v1.0 启动节点。

于 2020-03-07T22:34:03.540 回答