Застрял при разговоре с RDS/Aurora с узла

Думал, что спрошу об этом, поскольку моя команда и я бьемся об это головой.

Мы пытаемся настроить доступ к 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 и может подсказать?

Спасибо :)


person Terry_Brown    schedule 22.09.2017    source источник
comment
Также добавлено «, ssl: Amazon RDS», что помогло и, безусловно, привело нас к authSwitchHandler, но все равно получил отказ в доступе.   -  person Terry_Brown    schedule 22.09.2017
comment
и мы получаем действительный обратно Просто проверяем: как вы определяете, что он действителен?   -  person Michael - sqlbot    schedule 22.09.2017
comment
мы сгенерировали токен как с помощью инструментов AWS cli, так и с помощью кода, и структура и семантика в токене выглядят одинаково. Я предполагаю, что «валидный» является, вероятно, более подходящим термином — он выглядит синтаксически правильным — является ли он действительным и рабочим, мы, очевидно, пока не знаем.   -  person Terry_Brown    schedule 23.09.2017


Ответы (1)


Вы заставили это работать из командной строки? Я боролся с этим, пока кто-то не нашел это .

Загрузите https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem и добавьте --ssl-ca=rds-combined-ca-bundle.pem в командную строку.

Разочаровывает, поскольку этого нет в пошаговом руководстве AWS (по крайней мере, пока что, наш TAM собирается добавить его туда).

Если это работает в командной строке, попробуйте добавить это к вашему объекту конфигурации соединения:

   ssl: {
      ca: fs.readFileSync("/tmp/rds-combined-ca-bundle.pem")
   },

Это должно продвинуть вас дальше.

person Rodney Gitzel    schedule 02.12.2017
comment
Эй, вместе, у меня тоже не получается. Можете ли вы привести полный пример? Вы используете сиквелис? - person Manuel; 14.05.2018