【问题标题】:Stuck on talking to RDS/Aurora from node坚持从节点与 RDS/Aurora 交谈
【发布时间】:2017-09-22 14:57:52
【问题描述】:

我以为我会作为我的团队提出这个问题,但我正在努力反对这个。

我们正在尝试通过 IAM 角色和节点设置 Aurora/RDS (Mysql) 访问。

我们尝试了许多不同的方法,以及两个特定的节点/mysql 库(https://github.com/mysqljs/mysqlhttps://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


【解决方案1】:

您是否通过命令行使其工作?我为此苦苦挣扎,直到有人找到this

下载https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem 并将--ssl-ca=rds-combined-ca-bundle.pem 添加到您的命令行。

令人沮丧,因为这不在 AWS 演练中(至少现在还没有,我们的 TAM 将把它放在那里)。

如果这适用于命令行,请尝试将 this 添加到您的连接配置对象:

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

这应该会让你走得更远。

【讨论】:

  • 大家好,我也不会让它工作。你能提供一个完整的例子吗?你使用后遗症吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-06
  • 1970-01-01
  • 2020-05-14
  • 2011-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多