2014-02-27 135 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安全組配置問題