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 8000DynamoDB 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(odocker 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 duplicadas —
serverless-dynamodb-localyserverless-offlineintentando ambas enlazar el 8000, o dos stacks dedocker-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
- Encuentra qué ocupa el puerto:
lsof -i :8000 # macOS / Linux netstat -ano | findstr :8000 # Windows (note the PID) - Detén ese proceso (o el DynamoDB Local antiguo):
kill <PID> # macOS / Linux taskkill /PID <PID> /F # Windows - 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 - ¿Docker? Cambia el lado del host del mapeo (
-p 8001:8000) y conecta a8001. - 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
- Unable to start DynamoDB Local process — el emulador falla al arrancar por otras razones (Java, librerías nativas).
- Could not connect to DynamoDB Local (ECONNREFUSED) — la otra cara: no hay nada escuchando donde marcas.
- Aprende: Ejecutar DynamoDB Local
Fuentes
- Deploying DynamoDB locally on your computer — AWS DynamoDB Developer Guide (default port 8000; "If port 8000 is unavailable, this command throws an exception")
- DynamoDB local usage notes — AWS DynamoDB Developer Guide (the
-portcommand line option and full flag list) - amazon/dynamodb-local — Docker Hub (official image and port mapping)