DynamoDB ResourceInUseException

TL;DR — Você tentou uma operação de tabela em uma tabela que já existe ou ainda está em transição (CREATING/UPDATING/DELETING). Verifique primeiro o status da tabela ou torne a criação idempotente ignorando "já existe".

O que significa

ResourceInUseException: Table already exists: <name>
ResourceInUseException: Attempt to change a resource which is still in use: Table is being created/deleted

# what the engine actually returns, reproduced against DynamoDB Local:
ResourceInUseException: Cannot create preexisting table

As operações do control-plane (CreateTable, DeleteTable, UpdateTable) exigem que a tabela esteja em um estado compatível. Este erro significa que não é - ou já existe ou está no meio da transição e o DynamoDB não aceitará outra operação até que se estabeleça no ACTIVE. DynamoDB o retorna com status HTTP 400 e não é possível tentar novamente no estado em que se encontra - tentar novamente a solicitação idêntica falha até que o estado mude (aguarde a conclusão da transição ou altere a solicitação).

Por que isso acontece

  • Reexecutando CreateTable para uma tabela que já existe (uma migração repetida/deploy, testes que não limpam).
  • Operando durante uma transição — criando um índice, excluindo ou atualizando enquanto a tabela ainda é CREATING/UPDATING.
  • Uma corrida — dois processos criando a mesma tabela simultaneamente.

Como corrigir

  1. Verifique o status antes de agir. DescribeTable → prossiga somente quando TableStatus for ACTIVE; use um waiter (waitUntilTableExists) para bloquear até que ele se estabilize.
  2. Faça a criação idempotente. Capture ResourceInUseException em CreateTable e trate-o como sucesso (a tabela que você queria existe).
  3. Serialize operações de tabela em testes/migrations para que duas não sejam executadas ao mesmo tempo; limpe as tabelas de teste na desmontagem.

Exemplo

import {DynamoDBClient, CreateTableCommand, ResourceInUseException} from '@aws-sdk/client-dynamodb';

const client = new DynamoDBClient({});

try {
  await client.send(new CreateTableCommand(tableDef));
} catch (err) {
  if (!(err instanceof ResourceInUseException)) throw err;
  // Table already exists — that's fine, carry on.
}

FAQ

O que ResourceInUseException significa em DynamoDB? Uma operação de control-plane (CreateTable, DeleteTable, UpdateTable) teve como alvo uma tabela que já existe ou ainda está em transição por meio de CREATING, UPDATING ou DELETING. O DynamoDB não aceitará outra operação até que a tabela seja definida como ACTIVE.

Como posso tornar o CreateTable idempotente? Capture a ResourceInUseException e trate-a como sucesso — a tabela que você queria existe. Alternativamente, verifique primeiro o DescribeTable e crie apenas quando a tabela estiver ausente, usando um waiter como o waitUntilTableExists para bloquear até que ela se acomode.

Caminho no DynoTable

Quando uma migração executa novamente o CreateTable, o DynoTable mostra a tabela assim que existe — abra-o com ⌘KAbra tabela por nome enquanto seu script novas tentativas. Configurações da tabela em uma guia aberta exibe TableStatus (CREATING, UPDATING, ACTIVE) para que você possa esperar pelo ACTIVE antes de emitir o próximo mudança de control-plane. Para iteração local, aponte um perfil Local para http://localhost:8000 (Executando DynamoDB Local) e use o conversor DynamoDB JSON para carregar sementes itens assim que a tabela estiver resolvida.

Para tabelas na nuvem presas no UPDATING, Configurações da tabela também lista o GSI em andamento preenchimentos – aguarde ACTIVE em cada índice antes do próximo UpdateTable em seu script de implantação.

Contra o DynamoDB Local, o mesmo ResourceInUseException aparece quando um teste executa novamente o CreateTable em uma instância na memória que nunca foi apagada – tratar Local como nuvem e detecte o erro ou aguarde ACTIVE.

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.