DynamoDB Local: Dirección ya en uso (puerto 8000)

TL;DR: DynamoDB Local vincula el puerto 8000 de forma predeterminada, y algo ya lo contiene: un DynamoDB Local anterior que no detuviste, otro servicio o un serverless-offline/contenedor duplicado. Libere el puerto 8000 o inicie Local en un puerto diferente con -port (y apunte su client hacia él).

Qué significa

Exception in thread "main" java.net.BindException: Address already in use
   ... Failed to bind to port 8000

DynamoDB Local es un proceso Java que abre un socket de escucha en el puerto 8000. Si ese puerto ya está enlazado, la JVM no puede reclamarlo y sale con BindException. Es puramente un conflicto de puerto local — nada que ver con AWS ni con credenciales.

Por qué ocurre

  • Un DynamoDB Local anterior sigue en marcha — un java -jar DynamoDBLocal.jar (o docker run) previo que nunca paraste.
  • Otro servicio ocupa el 8000 — un servidor de desarrollo, un proxy o una app no relacionada en el mismo puerto.
  • Herramientas duplicadasserverless-dynamodb-local y serverless-offline intentando ambas enlazar el 8000, o dos stacks de docker-compose up.
  • Una instancia caída dejó el puerto enlazado brevemente (TIME_WAIT), o un contenedor zombi.

Serverless y runners de tests

El plugin serverless-dynamodb-local y los hooks de globalSetup de Jest suelen arrancar Local de forma implícita — si además lanzas docker run -p 8000:8000 amazon/dynamodb-local a mano, el segundo intento de enlace muere con BindException aunque Local ya esté sano. Elige un único lanzador por sesión de máquina.

En macOS, los procesos Java huérfanos de un runner de tests del IDE son un culpable frecuente — lsof -i :8000 suele mostrar java con un PID de una ejecución anterior de Gradle.

Cómo solucionarlo

  1. Encuentra qué ocupa el puerto:
    lsof -i :8000                       # macOS / Linux
    netstat -ano | findstr :8000        # Windows (note the PID)
  2. Detén ese proceso (o el DynamoDB Local antiguo):
    kill <PID>                          # macOS / Linux
    taskkill /PID <PID> /F              # Windows
  3. O ejecuta DynamoDB Local en un puerto distinto y actualiza tu cliente:
    java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -port 8001
    # then: endpoint = http://localhost:8001
  4. ¿Docker? Cambia el lado del host del mapeo (-p 8001:8000) y conecta a 8001.
  5. Elimina plugins/stacks duplicados para que solo un proceso intente enlazar el puerto.

En DynoTable

Tras liberar el puerto 8000 (o mover Local a -port 8001), instala DynoTable y añade un perfil Local en Settings → Profiles → Add Profile: pon el endpoint http://localhost:8000 (o tu puerto alternativo), una región de relleno y credenciales ficticias alfanuméricas. Test Connection confirma que el emulador está escuchando antes de que explores tablas. Recorrido: Ejecutar DynamoDB Local · Conectar a DynamoDB Local y LocalStack.

Cuando cambies de puerto, actualiza el endpoint del perfil para que coincida — un perfil que sigue apuntando a :8000 mientras Local escucha en :8001 produce conexión rechazada incluso después de resolver el conflicto de enlace. El conversor de DynamoDB JSON ayuda a cargar datos de siembra cuando Local sea alcanzable.

Errores relacionados

Fuentes

Trabaja con DynamoDB sin la Consola

Un cliente de escritorio rápido para DynamoDB que ejecuta el SQL real que DynamoDB no puede — JOINs, GROUP BY, agregaciones — con edición visual y un agente de IA con tus propias claves de Bedrock.

Prueba gratuita de 30 días, sin tarjeta — después, el plan Free sin límite de tiempo.