Ich versuche eine Lambda-Funktion mit Node.js zu schreiben, die sich mit meiner RDS-Datenbank verbindet. Die Datenbank funktioniert und ist über meine Elastic Beanstalk-Umgebung zugänglich. Wenn ich die Funktion ausführe, wird ein Timeout-Fehler zurückgegeben.
Es wurde versucht, den Timeout um bis zu 5 Minuten mit exakt demselben Ergebnis zu erhöhen.
Nach einigen Nachforschungen kam ich zu dem Schluss, dass es sich wahrscheinlich um ein Sicherheitsproblem handelt, aber die Lösung in der Dokumentation von Amazon oder in diese Antwort (die einzige, die ich zu dem Thema finden konnte).
Hier sind die Sicherheitsdetails:
Mein Code ist:
%Vor%Das Ergebnis, das ich bekomme, ist:
%Vor% Ich möchte allen danken, die geholfen haben, das Problem stellte sich als anders heraus, als ich dachte. Das callback
im Code funktioniert aus irgendeinem Grund nicht, obwohl es in AMAZON'S EIGENE VORGABEN SAMPLE ist.
Der Arbeitscode sieht so aus:
%Vor% Während die Verwendung des Kontexts funktioniert, müssen Sie nur context.callbackWaitsForEmptyEventLoop = false;
zum Handler hinzufügen und dann den Callback wie folgt verwenden:
Die Antwort ist hier in der Dokumentation (brauchte ein paar Stunden, um das zu finden): Ссылка
Im Abschnitt "Vergleich der Kontext- und Rückrufmethoden" gibt es einen Hinweis "Wichtig", der die Dinge erklärt.
Am Ende der Notiz steht:
Wenn Sie also dasselbe Verhalten wie die Kontextmethoden möchten, müssen Sie die Eigenschaft context object, callbackWaitsForEmptyEventLoop, auf false setzen.
Grundsätzlich wird der Rückruf bis zum Ende der Ereignisschleife fortgesetzt, im Gegensatz zum Kontext, der die Ereignisschleife beendet. Wenn callbackWaitsForEmptyEventLoop gesetzt wird, funktioniert Callback wie ein Kontext.
Ich teile meine Erfahrung beim Verbinden von RDS.
Sie müssen
VPC
access fürLambda function
aktivieren, während dem Sie ihm eine Sicherheitsgruppe .
Anschließend aktivieren Sie in der Sicherheitsgruppe, die der RDS-Instanz zugewiesen ist, den Zugriff für die der Lambda-Funktion zugewiesene Sicherheitsgruppe.
Sie können weitere Informationen hier
erhaltenWenn Sie die Datenbank ursprünglich eingerichtet haben, wird automatisch eine Sicherheitsgruppe erstellt. Standard auf die IP, mit der Sie die DB eingerichtet haben. Wenn Sie von Lambda starten, blockiert diese Regel den Datenverkehr. Überprüfen Sie Ihre Db-Fehlerprotokolle, und Sie können bestätigen, dass die Verbindung abgewiesen wird.
%Vor%Sie müssen eine Regel in der Sicherheitsgruppe erstellen, um Lambda-Verkehr zuzulassen. Wechseln Sie zu Ihrer RDS-Instanzkonsole, klicken Sie auf die Sicherheitsgruppe und wählen Sie Eingang aus. Dort sehen Sie die Regeln. Dann machen Sie den Anruf, um sich für die Welt zu öffnen, die AWS Lambda IPs zu finden oder eine VPC zu erstellen.
Sowohl der RDS als auch der Lambda befinden sich in derselben Sicherheitsgruppe.
Das ist der Schlüssel. Standardmäßig ist die Kommunikation innerhalb derselben Sicherheitsgruppe nicht zulässig. Und Sie müssen es explizit zulassen (E.x sg-xxxxx ALL TCP). Dies funktioniert nur, wenn Ihr Lambda versucht, über private IP auf db zuzugreifen.
Wenn es versucht, es durch öffentliche IP zu erreichen, dass es nicht funktioniert und Sie dafür notwendige Löcher auch schlagen müssen.
Allerdings gibt es einen besseren Ansatz:
3306
in RDS sg für lambdas sg. Das Problem stammt nicht vom Timeout, sondern von der Art, wie Sie die Verbindung schließen. Verwenden Sie stattdessen .destroy()
, wenn Sie nicht auf den Rückruf warten wollen, ODER verwenden Sie den Rückruf korrekt, wenn Sie die Verbindung in .end(function(err) { //Now call your callback });
Weitere Informationen finden Sie in diesem Thread .
Ich habe auch ein ähnliches Timeout-Szenario erlebt. Problem nicht connection.end()
nach connection.connect()
. Connection.end()
sollte vor callback
erfolgen.
Arbeitscode:
%Vor%Tags und Links node.js amazon-web-services aws-lambda rds