Je rencontre des problèmes de connectivité avec ma fonction AWS Lambda basée sur Amazon VPC, ce qui entraîne une erreur. Comment puis-je résoudre ce problème?
Brève description
Vous recevez une erreur liée à la connexion lorsque vous essayez d'exécuter votre fonction Lambda Amazon Virtual Private Cloud (Amazon VPC) ciblant un point de terminaison ou un service distant. Cela peut être dû à un problème de connectivité réseau qui génère un message d'erreur. Par exemple, vous essayez de créer une table DynamoDB, mais l'opération expire.
Solution
Créez une fonction de test qui réplique la configuration réseau de la fonction cible que vous souhaitez tester. Cette opération est utile lorsque vous ne pouvez pas modifier la fonction cible afin d'ajouter une logique de dépannage. Pour obtenir plus d'informations sur la façon de configurer votre fonction Lambda pour accéder au VPC, veuillez consulter la section Configuration d'une fonction Lambda afin d'accéder aux ressources d'un VPC.
Voici un exemple de fonction de test définie :
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()
Dans cet exemple, le délai d'expiration du socket est défini sur 8 secondes. Par conséquent, il est nécessaire que la connexion soit établie dans ce délai, sinon elle échoue. Le cas échéant, vous pouvez ajuster cette valeur.
La bibliothèque de sockets est une dépendance de runtime qui n'est pas groupée par défaut avec le runtime Python. Incluez-la dans le package de déploiement ou dans une couche associée à la fonction. Afin d'obtenir davantage d'informations sur la façon de déployer des dépendances avec une archive zip, veuillez consulter la section Déploiement de fonctions Lambda Python avec des archives de fichiers .zip. Veuillez consulter la section Utilisation de couches avec votre fonction Lambda pour obtenir plus d'informations sur la façon de déployer des dépendances en tant que couches.
Remarque : il est recommandé d'essayer de répliquer le runtime de la fonction cible. La fonction de test est écrite en Python, il est cependant possible de la transférer sur d'autres runtimes.
Une fois la fonction de test en place, effectuez le dépannage en procédant comme suit :
- Définissez le nom d'hôte et les variables de port afin qu'ils correspondent à ceux auxquels la fonction cible tente d'établir une connexion.
- Reflétez la configuration réseau (sous-réseau et groupe de sécurité) de la fonction cible.
- Définissez une valeur de délai d'expiration de fonction tenant compte d'éventuelles surcharges. Afin de permettre la connexion, il est recommandé de s'assurer que le délai d'expiration de la fonction est supérieur au délai de connexion du socket.
- Lancez le test.
Si le test échoue, il y a probablement un problème de connectivité qui doit être analysé. Si le test réussit, il y a probablement une connectivité entre l'environnement Lambda Amazon VPC (ce qui inclut le groupe de sécurité) et le point de terminaison. Dans ce cas, il y a probablement un problème avec la fonction cible et l'une de ses dépendances.
Remarque : il est recommandé de vérifier que la fonction de test est lancée dans un sous-réseau similaire à celui de la fonction cible défaillante lorsque plusieurs sous-réseaux avec des profils de routage différents sont impliqués.
Si le sous-réseau défaillant n'est pas connu, examinez les différents sous-réseaux afin d'identifier celui défaillant en procédant comme suit :
- Spécifiez le premier sous-réseau et ignorez l'avertissement de disponibilité puisque vous ne déploierez pas sur une plate-forme de production.
- Testez la fonction.
- Spécifiez le sous-réseau suivant, puis testez à nouveau.
- Répétez l'étape précédente jusqu'à ce que l'ensemble des sous-réseaux soient vérifiés.