Ich habe Verbindungsprobleme mit meiner Amazon-VPC-basierten AWS-Lambda-Funktion, die zu einem Fehler führt. Wie kann ich dies beheben?
Kurzbeschreibung
Wenn Sie versuchen, Ihre Lambda-Funktion in der Amazon Virtual Private Cloud (Amazon VPC) für einen Remote-Endpunkt oder einen Remote-Service auszuführen, wird ein verbindungsbezogener Fehler angezeigt. Dies kann auf ein Netzwerkverbindungsproblem zurückzuführen sein, das eine Fehlermeldung erzeugt. Sie versuchen beispielsweise, eine DynamoDB-Tabelle zu erstellen, aber der Vorgang überschreitet das Zeitlimit.
Lösung
Erstellen Sie eine Testfunktion, die die Netzwerkkonfiguration der zu testenden Zielfunktion repliziert. Dies ist nützlich, wenn Sie die Zielfunktion nicht bearbeiten können, um eine Fehlerbehebungslogik zu erhalten. Weitere Informationen zum Konfigurieren Ihres Lambda für den VPC-Zugriff finden Sie unter Konfigurieren einer Lambda-Funktion für den Zugriff auf Ressourcen in einer VPC.
Dies ist ein Beispiel für eine gegebene Testfunktion:
import socket
def connect_tcp(event, context):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(8)
hostname = "www.amazon.com"
port = 443
server_address = (hostname, port) # Server address and port
try:
IPAddr = socket.gethostbyname(hostname)
print("Hostname: " + hostname)
print("Host IP:" + IPAddr)
print("Attempting to connect ..")
sock.connect(server_address)
sock.shutdown(socket.SHUT_RDWR)
print("connected")
except Exception as e:
print("-- Error --")
print(e)
finally:
sock.close()
In diesem Beispiel ist das Socket-Timeout auf 8 Sekunden festgelegt, d. h. die Verbindung muss innerhalb dieser Zeit hergestellt werden, andernfalls schlägt sie fehl. Sie können diesen Wert bei Bedarf anpassen.
Die Socket-Bibliothek ist eine Laufzeitabhängigkeit, die nicht standardmäßig mit der Python-Laufzeitumgebung gebündelt ist. Nehmen Sie sie in das Bereitstellungspaket oder in eine Ebene auf, die mit der Funktion verknüpft ist. Weitere Informationen zum Bereitstellen von Abhängigkeiten mit ZIP-Dateiarchiven finden Sie unter Bereitstellen von Python-Lambda-Funktionen mit ZIP-Dateiarchiven. Weitere Informationen zum Bereitstellen von Abhängigkeiten als Ebene finden Sie unter Verwenden von Ebenen mit Ihrer Lambda-Funktion.
Hinweis: Es empfiehlt sich, die Laufzeit der Zielfunktion zu replizieren. Die Testfunktion ist in Python geschrieben, kann aber auf andere Laufzeiten übertragen werden.
Wenn die Testfunktion eingerichtet ist, führen Sie zur Fehlerbehebung folgende Schritte aus:
- Stellen Sie den Hostnamen und die Port-Variablen so ein, dass sie mit denen übereinstimmen, zu denen die Zielfunktion versucht, eine Verbindung herzustellen.
- Spiegeln Sie die Netzwerkkonfiguration (Subnetz und Sicherheitsgruppe) der Zielfunktion.
- Legen Sie einen Timeout-Wert für die Funktion fest, der einen eventuellen höheren Zeitbedarf berücksichtigt. Es empfiehlt sich, das Funktions-Timeout höher festzulegen als das Timeout der Socket-Verbindung, um eine Verbindung zu ermöglichen.
- Führen Sie den Test durch.
Wenn der Test fehlschlägt, liegt wahrscheinlich ein Verbindungsproblem vor, das untersucht werden muss. Wenn der Test erfolgreich ist, besteht wahrscheinlich eine Verbindung zwischen der Lambda-Amazon-VPC-Umgebung (einschließlich der Sicherheitsgruppe) und dem Endpunkt. In diesem Fall liegt wahrscheinlich ein Problem mit der Zielfunktion und ihren Abhängigkeiten vor.
Hinweis: Es empfiehlt sich, zu überprüfen, ob die Testfunktion in einem ähnlichen Subnetz wie die fehlerhafte Zielfunktion unter Beteiligung mehrerer Subnetze mit unterschiedlichen Routingprofilen gestartet wird.
Wenn das fehlerhafte Subnetz nicht bekannt ist, gehen Sie die Subnetze durch, um das fehlerhafte Subnetz zu identifizieren, indem Sie die folgenden Schritte ausführen:
- Geben Sie das erste Subnetz an und ignorieren Sie die Verfügbarkeitswarnung, da Sie es nicht auf einer Produktionsplattform bereitstellen möchten.
- Testen Sie die Funktion.
- Geben Sie das nächste Subnetz an und wiederholen Sie den Test.
- Wiederholen Sie den vorherigen Schritt, bis alle Subnetze geprüft sind.