EC2上的node.js无法连接到RDS

时间:2014-02-27 23:35:30

标签: node.js ubuntu amazon-ec2 amazon-rds

我有一个在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出站默认值,并说它允许所有出站流量。

为什么会发生这种情况?

3 个答案:

答案 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_AHOST_DEV在RDS安全组中列入白名单,但HOST_B不是您尝试运行代码的地方。

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

我试图想象您在帖子中提到的各种主机,并认为这是RDS安全组配置问题

答案 2 :(得分:0)

我的不好,这是节点版本的问题。由于某种原因apt-get安装节点0.6但我需要0.10。从git安装后,它就像一个魅力。