Terjebak saat berbicara dengan RDS/Aurora dari node

Kupikir aku akan menanyakan ini sebagai timku dan aku berusaha keras untuk menentangnya.

Kami mencoba mengatur akses Aurora/RDS (Mysql) melalui IAM role dan node.

Kami telah mencoba sejumlah pendekatan berbeda, dan dua pustaka node/mysql tertentu (https://github.com/mysqljs/mysql dan https://github.com/sidorares/node-mysql2).

Kami dapat menggunakan RDS Signer untuk menghasilkan token yang sesuai, dan kami mendapatkan token yang valid kembali.

Kami kemudian mencoba terhubung ke DB seperti yang ditunjukkan di bawah ini. Kami telah mencoba dengan sejumlah pendekatan berbeda dari kedua perpustakaan di atas - sepertinya kami perlu mengaktifkan kata sandi hapus mysql (sesuai https://github.com/sidorares/node-mysql2/issues/438#issuecomment-255343793)

Kode kami (memberi atau menerima) adalah:

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();
});

Kita mendapatkan:

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)

Saya merasa ada satu langkah yang kita lewatkan, namun saya tidak tahu langkah apa itu. Adakah yang bisa memecahkan tarian aurora/rds/iam/node dan dapat memberikan petunjuk?

Terima kasih :)


person Terry_Brown    schedule 22.09.2017    source sumber
comment
Juga menambahkan ',ssl: Amazon RDS' yang membantu, dan tentu saja membawa kita ke authSwitchHandler, tetapi akses masih ditolak.   -  person Terry_Brown    schedule 22.09.2017
comment
dan kami mendapatkan yang valid kembali Hanya memeriksa: bagaimana Anda menentukan bahwa itu valid?   -  person Michael - sqlbot    schedule 22.09.2017
comment
kami telah membuat token dengan alat AWS cli, dan melalui kode, dan struktur serta semantik dalam token terlihat sama. Saya kira 'valid' mungkin adalah istilah yang lebih tepat - secara sintaksis terlihat benar - apakah valid dan berfungsi, kami jelas belum tahu.   -  person Terry_Brown    schedule 23.09.2017


Jawaban (1)


Sudahkah Anda membuatnya berfungsi dari baris perintah? Saya kesulitan dengan hal itu, sampai seseorang menemukan ini.

Unduh https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem dan tambahkan --ssl-ca=rds-combined-ca-bundle.pem ke baris perintah Anda.

Membuat frustrasi, karena hal itu tidak ada dalam panduan AWS (setidaknya belum, TAM kami akan menempatkannya di sana).

Jika itu berfungsi pada baris perintah, coba tambahkan ini ke objek konfigurasi koneksi Anda:

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

Itu akan membawa Anda lebih jauh.

person Rodney Gitzel    schedule 02.12.2017
comment
Hai bersama-sama, saya juga tidak akan berhasil. Bisakah Anda memberikan contoh lengkapnya? Apakah Anda menggunakan sekuel? - person Manuel; 14.05.2018