我有一个在EC2实例(运行Ubuntu)上运行的node.js应用程序试图连接到RDS上的MySQL。 RDS实例的安全组包含EC2实例的安全组作为授权条目。两个实例都位于同一区域us-east-1c。
当我尝试使用MySQL CLI使用mysql -u xxxxx -h xxxxx.xxxxxx.us-east-1.rds.amazonaws.com -p
连接到RDS时,我连接没有任何问题。
但是,当我尝试使用我编写的RDS连接测试实用程序进行连接时,我得到Error: connect ECONNREFUSED
。测试实用程序代码是:
var mysql = require('mysql');
mysqlConfiguration = 'production';
var mysqlConfigs = {
'production':{
host:'xxxxx.xxxxx.us-east-1.rds.amazonaws.com',
password:'xxxxx',
user:'xxxxx',
database:'xxxxx'
},
}
var connectionPool = mysql.createPool({
host: mysqlConfigs[mysqlConfiguration]['host'],
user: mysqlConfigs[mysqlConfiguration]['user'],
password: mysqlConfigs[mysqlConfiguration]['password'],
database: mysqlConfigs[mysqlConfiguration]['database'],
multipleStatements: true,
connectionLimit: 50,
});
connectionPool.getConnection(function(err,db){
console.log(err);
console.log(db);
if(db) db.release();
});
我收到的错误表明连接被拒绝。当我在我的开发机器上运行此代码时(它与RDS实例列入白名单),它通常连接到RDS。
{ [Error: connect ECONNREFUSED]
code: 'ECONNREFUSED',
errno: 'ECONNREFUSED',
syscall: 'connect',
fatal: true }
我可以从命令行使用mysql进行连接,但我无法从node.js应用程序进行连接,这很奇怪。
我查看了EC2文档中的EC2 iptables出站默认值,并说它允许所有出站流量。
为什么会发生这种情况?
答案 0 :(得分:0)
在mysql中,用户的授权由'user'字符串加'hostname'字符串决定。因此授权/用户字符串可能如下所示:'xxxxx'@'xxxxx.xxxxx.us-east-1.rds.amazonaws.com'
您的节点应用程序可能正在使用“不同的”用户字符串进行连接。
您可以从mysql命令行尝试以下命令:
mysql> CREATE USER 'xxxxxx'@'%' IDENTIFIED BY 'your_password';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'xxxxxx'@'%'
-> WITH GRANT OPTION;
通过这种方式,您将拥有一个允许您访问数据库服务器的帐户,无论用户的主机部分是什么。
这可能是一个更简单的问题,您的用户根本无法访问数据库。你可以尝试:
mysql> GRANT ALL PRIVILEGES ON *.* TO 'xxxxxx'@'xxxxx.xxxxx.us-east-1.rds.amazonaws.com'
-> WITH GRANT OPTION;
或者它可能更简单。数据库是否存在?
mysql> SHOW DATABASES;
如果不存在,您可以尝试:
mysql> CREATE DATABASE <your-database-name>;
答案 1 :(得分:0)
当我尝试使用MySQL CLI使用
mysql -u xxxxx -h xxxxx.xxxxxx.us-east-1.rds.amazonaws.com -p
连接到RDS时,我连接没有任何问题。
这意味着您可以使用mysql cli
来解决RDS问题,例如 Host_A 。
当我在我的开发机器上运行此代码时(它与RDS实例列入白名单),它通常连接到RDS。
这意味着您可以使用your code
从 Host_DEV 连接到RDS。
但是,当我尝试使用我编写的RDS连接测试实用程序进行连接时,我得到
Error: connect ECONNREFUSED
。
这意味着,您无法使用your code
连接到RDS,例如 HOST_B 。
这听起来更像是RDS安全组的设置。
此外,您说明问题的方式,我看到HOST_A
和HOST_DEV
在RDS安全组中列入白名单,但HOST_B
不是您尝试运行代码的地方。
HOST_DEV
上工作正常,我认为问题不在您的代码中。您是否尝试使用mysql cli
中的HOST_B
连接到RDS?如果没有,那么先试试吧。我试图想象您在帖子中提到的各种主机,并认为这是RDS安全组配置问题
答案 2 :(得分:0)
我的不好,这是节点版本的问题。由于某种原因apt-get安装节点0.6但我需要0.10。从git安装后,它就像一个魅力。