2016-03-23 3 views
1

Ich verwende Lambda, um eine Verbindung zu einer PostgreS RDS-Instanz herzustellen, die Teil einer VPC ist. Wenn die Lambda-Funktion in einer Zeit lang nicht aufgerufen worden ist, wird die folgende Fehlermeldung nach ca. 2 Minuten von der Ausführung erhalten:AWS Lambda postgres Verbindung Zeitüberschreitung, aber nur auf den ersten Versuch

could not connect to postgres { [Error: connect ETIMEDOUT] code: 'ETIMEDOUT', errno: 'ETIMEDOUT', syscall: 'connect' } 

Wenn die Lambda-Funktion Wiederholungen erfolgreich in die Datenbank verbindet und führt, wie es sollte .

Die Lambda-Funktion wird für node.js mit dem Paket node-postgres geschrieben. Das Programm sieht wie folgt aus etwas zu verbinden:

var client = new pg.Client(conString); 
client.connect(function(err) { 
    console.log("client connected"); 
    if(err) { 
     context.fail('Connection failed'); 
    } 
    else { //do stuff } 
} 

Das Protokoll zeigt, dass es nie den „Client verbunden“ erreicht, bevor eine Zeitüberschreitung. Was läuft bei diesen ersten Versuchen falsch?

Hinweis: Wenn die Lambda-Funktion innerhalb von 20-30 Minuten erneut aufgerufen wird, tritt dieses Zeitlimit nicht auf und die Funktion wird erfolgreich ausgeführt.

+0

ich vermute, es versucht, eine alte Verbindung zur Datenbank wieder zu verwenden, aber die Verbindung ist abgelaufen. Rufen Sie 'client.end()' vor dem Beenden Ihrer Lambda-Funktion auf? –

+0

Ich habe auch über einige Probleme mit der ENI-Erstellungszeit gelesen, wenn Lambda-Funktionen mit VPC-Zugriff verwendet werden, die nicht extrem oft aufgerufen werden. Möglicherweise müssen Sie das Zeitlimit für die Datenbankverbindung erhöhen, um die zusätzliche Zeit zu berücksichtigen, die für eine Netzwerkverbindung erforderlich ist, wenn Amazon eine neue Instanz Ihrer Lambda-Funktion hochfährt. –

+0

client.end() wird aufgerufen, so dass keine Verbindungen offen bleiben. Die ENI-Erstellungszeit klingt wie eine gute Theorie, weil nachfolgende Aufrufe oder Wiederholungen nicht das gleiche Problem haben. Ich werde versuchen, das Zeitlimit der Datenbank zu erhöhen und die Lambda-Funktion auf das maximale Zeitlimit zu setzen. – Toast

Antwort

-3

dieses Problem mit mir passierte auch nach einigen Minuten ohne Lambda-Einsatz, wenn ich versuche Lambda-Funktion im ersten Versuch aufzurufen i bekommen

{ „errormessage“: „connect ETIMEDOUT“, „errortype“: "SequelizeConnectionError", "stackTrace": ["Handshake._callback (/var/task/node_modules/sequelize/lib/dialects/mysql/connection-manager.js:94:20)","Handshake.Sequence.end (/var/task/node_modules/mysql/lib/protocol/sequences/Sequence.js:96:24)","Protocol.handleNetworkError (/var/task/node_modules/mysql/lib/protocol/Protocol.js:364: 14) "," Connection._handleNetworkError (/var/task/node_modules/mysql/lib/Connection.js:421:18)","Connection._handleConnectTimeout (/var/task/node_modules/mysql/lib/Connection.js:417:8) "," Socket.g (events.js: 260: 16) "," emptNone (events.js: 67: 13) "," Socket.emit (events.js: 166: 7) "," Socket._onTimeout (net .js: 318: 8) "," _ runOnTimeout (timers.js: 524: 11) "," _ makeTimerTimeout (timers.js: 515: 3) "," Timer.unrefTimeout (timers.js: 584: 5) „]}

nach 2-3 Wiederholungen es funktioniert

+0

Das hilft nicht wirklich bei der Beantwortung der Frage. – hyprstack