Node.js中mysql2连接MySQL RDS(IAM角色)遇权限拒绝,如何启用明文插件?
使用IAM角色连接MySQL RDS时Node.js应用权限拒绝,命令行可成功连接
问题概况
同一EC2实例上,mysql命令行客户端通过IAM角色能正常连接MySQL RDS,但Node.js应用采用相同方式连接时触发权限拒绝。应用使用数据库密码而非IAM token时可正常连接,推测需为mysql2组件启用明文插件,但不清楚连接配置中对应的参数名称。
补充说明
- 应用使用数据库用户密码可正常连接RDS;
- AWS RDS、安全组及MySQL用户配置无问题:EC2命令行客户端(密码/token均可)、本地DBeaver(密码)、Node.js应用(密码)均能成功连接;
- 命令行用token登录时必须添加
--enable-cleartext-plugin参数,省略则同样出现权限拒绝,示例命令:mysql --host=[rds-database-endpoint] --port=3306 --enable-cleartext-plugin --user=[user-name] --password=[token generated using @aws-sdk/rds-signer]
当前Node.js连接代码
const mysql = require('mysql2'); async function connectToDb(){ // 生成IAM认证token const { Signer } = require("@aws-sdk/rds-signer"); const signer = new Signer({ hostname: [aws-rds-databasehost-endpoint], port: 3306, username: [user-name], region: "us-east-2", }); const token = await signer.getAuthToken(); // 连接RDS实例 const dbConnection = mysql.createConnection({ host: 'host-details', user: 'user_name', password: token, database: 'database-name', // 猜测需添加类似enableCleartext: true的参数 }); return dbConnection; }
解决方法
在mysql2的连接配置中,对应命令行--enable-cleartext-plugin的参数是enableCleartextPlugin,将其设为true即可。修改后的连接配置如下:
const dbConnection = mysql.createConnection({ host: 'host-details', user: 'user_name', password: token, database: 'database-name', enableCleartextPlugin: true // 启用明文插件,适配RDS IAM认证 });
RDS IAM认证的token本身是经过AWS签名的安全字符串,无需加密传输,启用该插件后mysql2会以明文形式传递token,从而通过权限校验。
内容的提问来源于stack exchange,提问作者GenerikError
相关产品推荐
相关产品推荐

