DynamoDB ResourceInUseException

TL;DR — Du hast eine Tabellenoperation auf einer Tabelle versucht, die bereits existiert oder noch im Übergang ist (CREATING / UPDATING / DELETING). Prüfe zuerst den Status der Tabelle, oder mache das Erstellen idempotent, indem du "already exists" ignorierst.

Was es bedeutet

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

Control-Plane-Operationen (CreateTable, DeleteTable, UpdateTable) verlangen, dass die Tabelle in einem kompatiblen Zustand ist. Dieser Fehler bedeutet, dass sie es nicht ist — entweder existiert sie bereits, oder sie ist mitten im Übergang und DynamoDB akzeptiert keine weitere Operation, bis sie sich auf ACTIVE beruhigt. DynamoDB gibt ihn mit HTTP-Status 400 zurück, und er ist so wie er ist nicht wiederholbar — den identischen Request zu wiederholen scheitert, bis sich der Zustand ändert (warte, bis der Übergang abgeschlossen ist, oder ändere den Request).

Warum es passiert

  • Erneutes Ausführen von CreateTable für eine Tabelle, die bereits existiert (eine wiederholte Migration/ein wiederholtes Deployment, Tests, die nicht aufräumen).
  • Operation während eines Übergangs — einen Index erstellen, löschen oder aktualisieren, während die Tabelle noch CREATING/UPDATING ist.
  • Ein Wettlauf — zwei Prozesse, die dieselbe Tabelle gleichzeitig erstellen.

So behebst du es

  1. Prüfe den Status, bevor du handelst. DescribeTable → fahre nur fort, wenn TableStatus ACTIVE ist; nutze einen Waiter (waitUntilTableExists), um zu blockieren, bis sie sich beruhigt.
  2. Mache das Erstellen idempotent. Fange ResourceInUseException bei CreateTable ab und behandle sie als Erfolg (die gewünschte Tabelle existiert).
  3. Serialisiere Tabellenoperationen in Tests/Migrationen, damit nicht zwei gleichzeitig laufen; räume Test-Tabellen im Teardown auf.

Beispiel

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

Was bedeutet ResourceInUseException in DynamoDB? Eine Control-Plane-Operation (CreateTable, DeleteTable, UpdateTable) zielte auf eine Tabelle, die bereits existiert oder noch durch CREATING, UPDATING oder DELETING übergeht. DynamoDB akzeptiert keine weitere Operation, bis sich die Tabelle auf ACTIVE beruhigt.

Wie mache ich CreateTable idempotent? Fange die ResourceInUseException ab und behandle sie als Erfolg — die gewünschte Tabelle existiert. Alternativ prüfe zuerst DescribeTable und erstelle nur, wenn die Tabelle fehlt, unter Verwendung eines Waiters wie waitUntilTableExists, um zu blockieren, bis sie sich beruhigt.

Weg in DynoTable

Wenn eine Migration CreateTable erneut ausführt, zeigt DynoTable die Tabelle, sobald sie existiert — öffne sie mit ⌘KOpen table by name, während dein Skript weiter probiert. Tabelleneinstellungen zeigen auf einem offenen Tab TableStatus (CREATING, UPDATING, ACTIVE), sodass du auf ACTIVE warten kannst, bevor du die nächste Control-Plane-Änderung absetzt. Für lokales Arbeiten richte ein Local-Profil auf http://localhost:8000 aus (Running DynamoDB Local) und nutze den DynamoDB JSON Converter, um Seed-Items zu laden, sobald die Tabelle sich beruhigt hat.

Bei Cloud-Tabellen, die in UPDATING hängen, listen Tabelleneinstellungen auch laufende GSI-Backfills auf — warte auf ACTIVE bei jedem Index, bevor im Deploy-Skript das nächste UpdateTable kommt.

Gegen DynamoDB Local erscheint dieselbe ResourceInUseException, wenn ein Test CreateTable erneut gegen eine In-Memory-Instanz ausführt, die nie geleert wurde — behandle Local wie die Cloud und fange den Fehler ab oder warte auf ACTIVE.

Verwandte Fehler

Quellen

Mit DynamoDB ohne die Console arbeiten

Ein schneller DynamoDB-Desktop-Client, der das echte SQL ausführt, das DynamoDB nicht kann — JOINs, GROUP BY, Aggregationen — mit visueller Bearbeitung und einem KI-Agenten auf deinen eigenen Bedrock-Schlüsseln.

30 Tage kostenlos testen, keine Kreditkarte — danach der Kostenlos-Tarif ohne Zeitlimit.