Думал, что спрошу об этом, поскольку моя команда и я бьемся об это головой.
Мы пытаемся настроить доступ к Aurora/RDS (Mysql) через роли IAM и node.
Мы испробовали несколько разных подходов и две конкретные библиотеки node/mysql (https://github.com/mysqljs/mysql и https://github.com/sidorares/node-mysql2).
Мы можем использовать RDS Signer для создания соответствующего токена, и мы получаем действительный обратно.
Затем мы пытаемся подключиться к БД, как показано ниже. Мы пробовали несколько разных подходов из обеих вышеперечисленных библиотек — похоже, нам нужно включить четкий пароль 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 и может подсказать?
Спасибо :)