2016-03-08 63 views
6

我想RDS使用lambda函數連接,但我得到一個錯誤:錯誤:連接ETIMEDOUT RDS拉姆達

var mysql = require('mysql'); 
exports.handler = function(event, context) { 
      //Connect to RDS 

var connection = mysql.createConnection({ 
host  : 'hostname', 
user  : 'username', 
password : 'password', 
database : 'database' 

}); 

connection.connect(function(err) 
{ 
    if (err) 
    { 
    throw err; 
    } 
else 
    { 
    console.log('DB connection establish'); 
    } 
    }); 

}; 

我得到的錯誤是:

START RequestId: 9711e650-e582-11e5-af5f-97ba391a42ae Version: $LATEST 

2016-03-08T23:08:06.737Z 9711e650-e582-11e5-af5f-97ba391a42ae  
Error: connect ETIMEDOUT 
    at Connection._handleConnectTimeout (/var/task/node_modules/mysql/lib/Connection.js:412:13)  
     at Socket.g (events.js:180:16) 
    at Socket.emit (events.js:92:17) 
    at Socket._onTimeout (net.js:327:8)  
    at _makeTimerTimeout (timers.js:429:11) 
    at Timer.unrefTimeout [as ontimeout] (timers.js:493:5)  
    -------------------- 
    at Protocol._enqueue (/var/task/node_modules/mysql/lib/protocol /Protocol.js:141:48)  
    at Protocol.handshake (/var/task/node_modules/mysql/lib/protocol /Protocol.js:52:41)  
    at Connection.connect (/var/task/node_modules/mysql  /lib/Connection.js:123:18)  
    at exports.handler (/var/task/exports.js:21:12)  
END RequestId: 9711e650-e582-11e5-af5f-97ba391a42ae   
REPORT RequestId: 9711e650-e582-11e5-af5f-97ba391a42ae 
Duration: 10988.17ms  
Process exited before completing request 

回答

2

我同樣的問題,並發現您的條目,而谷歌搜索,但現在我解決了它。 可悲的是我不肯定肯定,這實際上採取行動解決它,但檢查:

  • 如果你不使用的VPC的看它是否具有可公開訪問的RDS工程,用於測試目的
  • 格蘭特至少您的角色(例如lambda_basic_execution)身份和訪問管理區域內的AmazonRDSFullAccess
  • 在數據庫實例的RDS概述中,您可以單擊選定的安全組來編輯它們:在以下窗口中,您可以指定入站和出站流量規則。在我的工作示例中,我允許來自所有端口和所有IP(0.0.0.0/0)的所有流量。當然,這不是一個安全的解決方案,但就你的例子而言,我想你是 - 像我一樣 - 只是進入AWS並嘗試首先構建工作示例。您隨後可以隨時編輯這些規則,逐步限制流量。我這樣做是通過我自己的電腦在第一

來測試我的RDS訪問我做到了沒有在lambda功能設置VPC選項或API端點工作,並建立了通​​過

exports.handler = function(event, context) { 
var mysql  = require('mysql'); 
var connection = mysql.createConnection({ 
host  : 'hostwithoutport', 
user  : 'user', 
password : 'password', 
database : 'database' 
}); 

connection.query('SELECT * FROM Xy WHERE ID = "1"', function(err, rows) { 
if (err) { 
console.error('error connecting: ' + err.stack); 
context.fail(); 
return; 
} 

console.log('connected as id ' + connection.threadId); 
context.succeed(rows); 
}); 
}; 

你的連接也可以做不同的事情,但要記住總是成功和失敗(或完成)一個lambda函數,最好在語句後面的if子句中。否則,在查詢可以確定結果並且沒有得到正確的結果之前,由於lambda函數成功,您可能會遇到問題。如果您不以某種方式結束lambda函數,則函數本身會超時,但看起來不同。

還記得始終結束連接,這是直接使用查詢隱含 - 這種方法連接和結束本身。根據我在另一個線程中讀到的內容,理論上這個問題也可能由於您曾經調用過的仍然打開的連接而發生。

11

我遇到了同樣的問題,只是把它修好了。 鑑於這是在stackoverflow上這個問題的最佳搜索結果,我將在這裏發佈我的解決方案。

這個答案是一個VPC

  1. 場所內的RDS實例的lambda函數在同一VPC爲您的RDS實例
  2. 你的,你需要有VPC執行添加到它的Lambda執行的角色IAM
  3. 將安全組分配給lambda函數
  4. 在附加到RDS實例的安全性中,爲mysql/aurora添加入站規則(端口3306),而不是將其添加到IP地址中將其添加到您的lambda功能安全組。

總之,這將lambda放在與RDS相同的VPC中,並且不管lambda函數的IP如何,都給lambda函數入站訪問MYSQL。

+0

這解決了我的超時問題。謝謝! – SexxLuthor