¿Cómo soluciono los problemas de conectividad al URI con una función de Lambda?

Última actualización: 08-07-2022

Se producen problemas de conectividad con mi función de AWS Lambda con base en Amazon VPC que generan un error. ¿Cómo soluciono este problema?

Descripción corta

Recibe un error relacionado con la conexión al intentar ejecutar la función de Lambda de Amazon Virtual Private Cloud (Amazon VPC) dirigida a un punto de conexión o servicio remoto. Esto puede deberse a un problema de conectividad de red que genera un mensaje de error. Por ejemplo, intenta crear una tabla de DynamoDB, pero se agota el tiempo de espera de la operación.

Resolución

Cree una función de prueba que replique la configuración de red de la función de destino que desea probar. Esto resulta útil cuando no puede editar la función de destino para añadir una lógica de solución de problemas. Consulte Cómo configurar una función de Lambda para acceder a los recursos de una VPC a fin de obtener más información sobre cómo configurar Lambda para el acceso a una VPC.

Aquí tenemos un ejemplo de una función de prueba definida:

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()

En este ejemplo, se establecieron 8 de segundos de tiempo de espera para el socket, por lo que la conexión debe establecerse dentro de ese tiempo o, de lo contrario, se producirá un error. Si es necesario, puede ajustar este valor.

La biblioteca de sockets es una dependencia de tiempo de ejecución que no se incluye de forma predeterminada con el tiempo de ejecución de Python. Inclúyala como parte del paquete de despliegue o en una capa que se asocie a la función. Consulte Cómo implementar funciones de Lambda en Python con archivos.zip para obtener información sobre cómo implementar dependencias con archivos zip. Consulte Uso de capas con la función de Lambda para obtener información sobre cómo implementar las dependencias como capas.

Nota: Se recomienda intentar replicar el tiempo de ejecución de la función de destino. La función de prueba se escribió en Python, pero se puede transferir a otros tiempos de ejecución.

Una vez que haya instalado la función de prueba, solucione los problemas mediante los siguientes pasos:
  1. Configure las variables de nombre de host y puerto para que coincidan con las variables con las que la función de destino intenta establecer una conexión.
  2. Refleje la configuración de red (subred y grupo de seguridad) de la función de destino.
  3. Establezca un valor de tiempo de espera de la función para adaptarse a cualquier sobrecarga. Se recomienda asegurarse de que el tiempo de espera de la función sea mayor que el tiempo de espera de la conexión del socket para permitir una conexión.
  4. Haga la prueba.

Si la prueba sale mal, es probable que haya un problema de conectividad que deba investigarse. Si la prueba sale bien, es probable que haya una conectividad entre el entorno de Lambda de Amazon VPC (incluido el grupo de seguridad) y el punto de conexión. En este caso, posiblemente haya un problema con la función de destino y cualquiera de sus dependencias.

Nota: Se recomienda comprobar que la función de prueba se ejecute en una subred similar a la función de destino que no está funcionando cuando intervienen varias subredes con diferentes perfiles de enrutamiento.

Si no se sabe qué subred es la que no está funcionando, recorra las subredes para identificar cuál es mediante los siguientes pasos:

  1. Especifique la primera subred e ignore la advertencia de disponibilidad porque no la implementará en una plataforma de producción.
  2. Pruebe la función.
  3. Especifique la siguiente subred y vuelva a realizar la prueba.
  4. Repita el paso anterior hasta que se comprueben todas las subredes.

¿Le resultó útil este artículo?


¿Necesita asistencia técnica o con la facturación?