DynamoDB ResourceInUseException

TL;DR — Hai provato a eseguire un'operazione su una tabella che già esiste o è ancora in fase di transizione (CREATING / UPDATING / DELETING). Controlla prima lo stato della tabella o rendi la creazione idempotente ignorando "già esistente".

Cosa 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

Le operazioni del piano di controllo ("CreateTable", "DeleteTable", "UpdateTable") richiedono che la tabella sia in uno stato compatibile. Questo errore significa che non lo è: o esiste già o è a metà transizione e DynamoDB non accetterà un'altra operazione finché non si assesta su "ACTIVE". DynamoDB lo restituisce con lo stato HTTP 400 e non è possibile riprovare così com'è: riprovare la richiesta identica fallisce finché lo stato non cambia (attendere il completamento della transizione o modificare la richiesta).

Perché succede

  • Rieseguire CreateTable per una tabella che già esiste (una migrazione/distribuzione ripetuta, test che non puliscono).
  • Operazione durante una transizione: creazione di un indice, eliminazione o aggiornamento mentre la tabella è ancora in fase di "CREAZIONE"/"AGGIORNAMENTO".
  • Una gara: due processi che creano la stessa tabella contemporaneamente.

Come risolverlo

  1. Controlla lo stato prima di agire. DescribeTable → procedi solo quando TableStatus è ACTIVE; usa un cameriere ("waitUntilTableExists") per bloccare finché non si sistema.
  2. Rendi la creazione idempotente. Cattura ResourceInUseException su CreateTable e trattalo come un successo (la tabella che volevi esiste).
  3. Serializza le operazioni della tabella nei test/migrazioni in modo che due non vengano eseguiti contemporaneamente; ripulire le tabelle di test durante lo smontaggio.

Esempio

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

Cosa significa ResourceInUseException in DynamoDB? Un'operazione del piano di controllo ("CreateTable", "DeleteTable", "UpdateTable") ha preso di mira una tabella che esiste già o è ancora in fase di transizione attraverso CREATING, UPDATING o DELETING. DynamoDB non accetterà un'altra operazione finché la tabella non sarà impostata su ATTIVO.

Come faccio a rendere idempotente CreateTable? Cattura la ResourceInUseException e trattala come un successo: la tabella che volevi esiste. In alternativa, controlla prima "DescribeTable" e crea solo quando la tabella è assente, utilizzando un cameriere come "waitUntilTableExists" per bloccarla finché non si sistema.

Percorso in DynoTable

Quando una migrazione esegue nuovamente CreateTable, DynoTable mostra la tabella non appena esiste: aprilo con ⌘KApri tabella per nome mentre il tuo script riprova. Impostazioni tabella in una scheda aperta visualizza "TableStatus" ("CREATING", UPDATING, ACTIVE) in modo da poter attendere "ACTIVE" prima di emettere quello successivo cambiamento del piano di controllo. Per l'iterazione locale, puntare un profilo locale su http://localhost:8000 (In esecuzione DynamoDB Locale) e usa il convertitore DynamoDB JSON per caricare il seed articoli una volta che la tabella si è sistemato.

Per le tabelle cloud bloccate in UPDATING, Impostazioni tabella elenca anche in volo GSI backfill: attendi "ACTIVE" su ogni indice prima del successivo "UpdateTable" in il tuo script di distribuzione.

Contro DynamoDB Local, la stessa ResourceInUseException appare quando viene eseguito un test riesegue "CreateTable" su un'istanza in memoria che non è mai stata cancellata: tratta Locale come cloud e rileva l'errore o attendi "ACTIVE".

Errori correlati

Fonti

Lavora con DynamoDB senza la Console

Un client desktop veloce per DynamoDB che esegue il vero SQL che DynamoDB non può — JOINs, GROUP BY, aggregazioni — con modifica visuale e un agente AI sulle tue chiavi Bedrock.

Prova gratuita di 30 giorni, senza carta di credito — poi il piano Free senza limiti di tempo.