2014-02-27 53 views
0

我有一个运行在试图连接到RDS上的MySQL的EC2实例(运行Ubuntu)上的node.js应用程序。 RDS实例的安全组包含EC2实例的安全组作为授权条目。两个实例都在同一个区域,us-east-1c。EC2上的node.js无法连接到RDS

当我尝试使用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

我的坏的各个主机,这是与节点版本的问题。出于某种原因apt-get安装节点0.6,但我需要0.10。一旦从git安装它就像一个魅力。

0

在mysql中,用户的授权由'用户'字符串加'主机名'字符串决定。因此,授权/用户字符串可能看起来像这样:'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>; 
0

当我试图使用MySQL CLI使用mysql -u xxxxx -h xxxxx.xxxxxx.us-east-1.rds.amazonaws.com -p我连接没有任何问题连接到RDS。

这意味着您可以使用mysql cli从连接到RDS精细假设HOST_A

当我在我的开发机器上(这是与RDS实例列入白名单)上运行此代码时,它通常连接到RDS。

这意味着您可以使用从连接到RDS精细假设Host_DEV

然而,当我尝试使用RDS连接测试工具,我写来连接,我得到一个Error: connect ECONNREFUSED

这意味着,您无法连接上让我们说HOST_B使用到RDS。

这听起来更像是您的RDS安全组的设置。 此外,您说明问题的方式,我看到HOST_AHOST_DEV已在RDS安全组中列入白名单,但HOST_B不是您尝试运行代码的位置。

  • 再次检查您的RDS安全组设置,并确定您在那里配置了必要的访问权限。
  • 此外,由于您的代码在HOST_DEV上正常工作,因此我认为问题不在您的代码中。您是否尝试过使用mysql cliHOST_B连接到RDS?如果没有,那就先试试。

我试图想象你已经在你的文章中提到,并认为这是一个RDS安全组配置问题