【问题标题】:node.js on EC2 failing to connect to RDSEC2 上的 node.js 无法连接到 RDS
【发布时间】:2014-03-31 17:45:17
【问题描述】:

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

当我尝试使用mysql -u xxxxx -h xxxxx.xxxxxx.us-east-1.rds.amazonaws.com -p 使用 MySQL CLI 连接到 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 出站默认值,它说所有出站流量都是允许的。

任何想法为什么会发生这种情况?

【问题讨论】:

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


    【解决方案1】:

    在 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>;
    

    【讨论】:

      【解决方案2】:

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

      这意味着您可以使用来自 Host_Amysql cli 很好地连接到 RDS。

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

      这意味着您可以使用your code 连接到 RDS,比如 Host_DEV

      但是,当我尝试使用我编写的 RDS 连接测试实用程序进行连接时,我收到了 Error: connect ECONNREFUSED

      这意味着,您无法在 HOST_B 上使用 your code 连接到 RDS。

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

      • 仔细检查您的 RDS 安全组设置并确保您在那里配置了必要的访问权限。
      • 另外,由于您的代码在HOST_DEV 上运行良好,我认为问题不在于您的代码。您是否尝试过使用来自HOST_Bmysql cli 连接到RDS?如果没有,请先尝试。

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2021-04-17
          • 1970-01-01
          • 2021-07-29
          • 1970-01-01
          • 2020-10-17
          • 2018-05-12
          • 1970-01-01
          • 2020-10-19
          • 2020-03-18
          相关资源
          最近更新 更多