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 8000

O 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 (ou docker 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 duplicadasserverless-dynamodb-local e serverless-offline ambos tentando vincular a 8000, ou duas stacks docker-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

  1. Encontre o que ocupa a porta:
    lsof -i :8000                       # macOS / Linux
    netstat -ano | findstr :8000        # Windows (note the PID)
  2. Encerre esse processo (ou o DynamoDB Local antigo):
    kill <PID>                          # macOS / Linux
    taskkill /PID <PID> /F              # Windows
  3. 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
  4. Docker? Mude o lado do host no mapeamento (-p 8001:8000) e conecte-se à 8001.
  5. 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

Fontes

Trabalhe com o DynamoDB sem o Console

Um cliente desktop rápido para DynamoDB que roda o SQL de verdade que o DynamoDB não consegue — JOINs, GROUP BY, agregações — com edição visual e um agente de IA com suas próprias chaves do Bedrock.

Teste grátis de 30 dias, sem cartão de crédito — depois o plano Grátis sem limite de tempo.