【发布时间】:2017-09-22 14:57:52
【问题描述】:
我以为我会作为我的团队提出这个问题,但我正在努力反对这个。
我们正在尝试通过 IAM 角色和节点设置 Aurora/RDS (Mysql) 访问。
我们尝试了许多不同的方法,以及两个特定的节点/mysql 库(https://github.com/mysqljs/mysql 和 https://github.com/sidorares/node-mysql2)。
我们能够使用 RDS 签名器生成一个适当的令牌,并得到一个有效的返回。
然后我们尝试连接到数据库,如下所示。我们已经尝试了上述两个库中的多种不同方法 - 似乎我们需要启用 mysql 清除密码(根据https://github.com/sidorares/node-mysql2/issues/438#issuecomment-255343793)
我们的代码(给予或接受)是:
var AWS = require('AWS-SDK');
AWS.config.update({ "accessKeyId": "{valid access key}", "secretAccessKey": "{valid secret access key}", "region": "eu-west-1" });
var mysql = require('mysql2');
var signer = new AWS.RDS.Signer({
credentials: new AWS.SharedIniFileCredentials({profile: 'default'}),
region: 'eu-west-1',
hostname: '{rds database host}',
port: 3306,
username: '{rds database username}'
});
signer.getAuthToken({}, function(err, token){
console.log(token);
var connection = mysql.createConnection({
host : '{rds database host}',
user : '{rds database username}',
password : token,
port : 3306,
database: '{rds database}'
,authSwitchHandler: function ({pluginName, pluginData}, cb) {
if (pluginName === 'mysql_clear_password') {
// https://dev.mysql.com/doc/internals/en/clear-text-authentication.html
var password = dbConf.password + '\0';
var buffer = Buffer.from(password);
cb(null, buffer);
} else {
const err = new Error(`Unknown AuthSwitchRequest plugin name ${pluginName}`);
err.fatal = true;
cb(err);
}
}
});
connection.connect(function(err) {
if (err) {
console.error('Database connection failed: ' + err.stack);
return;
}
console.log('Connected to database.');
});
connection.end();
});
我们得到:
Database connection failed: Error: Access denied for user '{dbuser}'@'{ip address}' (using password: YES)
at Packet.asError (C:\Users\Terry.Brown\Desktop\iam-rds-auth\node_modules\mysql2\lib\packets\packet.js:703:13)
at ClientHandshake.Command.execute (C:\Users\Terry.Brown\Desktop\iam-rds-auth\node_modules\mysql2\lib\commands\command.js:28:22)
at Connection.handlePacket (C:\Users\Terry.Brown\Desktop\iam-rds-auth\node_modules\mysql2\lib\connection.js:515:28)
at PacketParser.onPacket (C:\Users\Terry.Brown\Desktop\iam-rds-auth\node_modules\mysql2\lib\connection.js:94:16)
at PacketParser.executeStart (C:\Users\Terry.Brown\Desktop\iam-rds-auth\node_modules\mysql2\lib\packet_parser.js:77:14)
at Socket.<anonymous> (C:\Users\Terry.Brown\Desktop\iam-rds-auth\node_modules\mysql2\lib\connection.js:102:29)
at emitOne (events.js:115:13)
at Socket.emit (events.js:210:7)
at addChunk (_stream_readable.js:250:12)
at readableAddChunk (_stream_readable.js:237:11)
我觉得我们缺少了一个步骤,但我不知道它是什么。有没有人解决了aurora/rds/iam/node dance 可以指点一下吗?
谢谢:)
【问题讨论】:
-
还添加了 ',ssl: "Amazon RDS"' 这有助于我们进入 authSwitchHandler,但仍然被拒绝访问。
-
“我们得到了一个有效的返回” 只是检查一下:你如何确定它是“有效的”?
-
我们已经使用 AWS cli 工具和通过代码生成了一个令牌,并且令牌中的结构和语义看起来相同。我想“有效”可能是更合适的术语——它看起来在语法上是正确的——它是否有效并且有效,我们显然还不知道。
标签: mysql node.js amazon-iam amazon-aurora