DynamoDB Local: Address already in use (port 8000)
TL;DR — O DynamoDB Local vincula a porta 8000 por padrão, e algo já a ocupa — um DynamoDB Local anterior que você não parou, outro serviço, ou um serverless-offline/contêiner duplicado. Ou libere a porta 8000 ou inicie o Local em uma porta diferente com -port (e aponte seu cliente para ela).
O que significa
Exception in thread "main" java.net.BindException: Address already in use
... Failed to bind to port 8000O DynamoDB Local é um processo Java que abre um socket de escuta na porta 8000. Se essa porta já está vinculada, a JVM não consegue reivindicá-la e sai com BindException. É puramente um conflito de porta local — nada a ver com AWS ou credenciais.
Por que isso acontece
- Um DynamoDB Local anterior ainda está rodando — um
java -jar DynamoDBLocal.jar(oudocker run) anterior que você nunca parou. - Outro serviço ocupa a 8000 — um servidor de dev, proxy ou app não relacionado na mesma porta.
- Ferramentas duplicadas —
serverless-dynamodb-localeserverless-offlineambos tentando vincular a 8000, ou duas stacksdocker-compose up. - Uma instância que travou deixou a porta vinculada brevemente (
TIME_WAIT), ou um contêiner zumbi.
Serverless e test runners
O plugin serverless-dynamodb-local e os hooks de globalSetup do Jest costumam
iniciar o Local implicitamente — se você também rodar docker run -p 8000:8000 amazon/dynamodb-local
manualmente, a segunda tentativa de bind morre com BindException mesmo com o Local
já saudável. Escolha um único lançador por sessão de máquina.
No macOS, processos Java órfãos deixados pelo test runner da IDE são um culpado frequente
— o lsof -i :8000 costuma mostrar java com um PID de uma execução anterior do Gradle.
Como corrigir
- Encontre o que ocupa a porta:
lsof -i :8000 # macOS / Linux netstat -ano | findstr :8000 # Windows (note the PID) - Encerre esse processo (ou o DynamoDB Local antigo):
kill <PID> # macOS / Linux taskkill /PID <PID> /F # Windows - Ou rode o DynamoDB Local em outra porta e atualize seu cliente:
java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -port 8001 # then: endpoint = http://localhost:8001 - Docker? Mude o lado do host no mapeamento (
-p 8001:8000) e conecte-se à8001. - Remova plugins/stacks duplicados para que apenas um processo tente vincular a porta.
No DynoTable
Depois de liberar a porta 8000 (ou mover o Local para -port 8001), instale o DynoTable
e adicione um perfil Local em Configurações → Perfis → Adicionar perfil: defina o endpoint
http://localhost:8000 (ou sua porta alternativa), uma região de espaço reservado e
credenciais fictícias alfanuméricas. O Testar conexão confirma que o emulador está
escutando antes de você navegar pelas tabelas. Passo a passo:
Executando DynamoDB Local ·
Conecte-se ao DynamoDB Local e LocalStack.
Ao mudar de porta, atualize o endpoint do perfil para corresponder — um perfil ainda
apontando para :8000 enquanto o Local escuta em :8001 produz
conexão recusada mesmo
depois de resolvido o conflito de bind. O conversor de DynamoDB JSON
ajuda a carregar dados de seed assim que o Local ficar acessível.
Erros relacionados
- Não é possível iniciar o processo local do DynamoDB — o emulador falha ao iniciar por outros motivos (Java, bibliotecas nativas).
- Could not connect to DynamoDB Local (ECONNREFUSED) — o outro lado: nada está escutando onde você disca.
- Aprenda: Executando DynamoDB Local
Fontes
- Deploying DynamoDB locally on your computer — AWS DynamoDB Developer Guide (porta padrão 8000; "If port 8000 is unavailable, this command throws an exception")
- DynamoDB local usage notes — AWS DynamoDB Developer Guide (a opção de linha de comando
-porte a lista completa de flags) - amazon/dynamodb-local — Docker Hub (imagem oficial e mapeamento de portas)