DynamoDB ResourceInUseException

TL;DR: intentó una operación de tabla en una tabla que ya existe o que aún está en transición (CREATING / UPDATING / DELETING). Primero verifique el estado de la tabla o haga que la creación sea idempotente ignorando "ya existe".

Qué 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

Las operaciones del plano de control (CreateTable, DeleteTable, UpdateTable) requieren que la tabla esté en un estado compatible. Este error significa que no lo está — o ya existe, o está en plena transición y DynamoDB no aceptará otra operación hasta que se asiente en ACTIVE. DynamoDB lo devuelve con estado HTTP 400, y no es reintentable tal cual — reintentar la petición idéntica falla hasta que el estado cambie (espera a que termine la transición, o cambia la petición).

Por qué ocurre

  • Volver a ejecutar CreateTable para una tabla que ya existe (una migración/despliegue repetido, pruebas que no limpian).
  • Operar durante una transición — crear un índice, borrar o actualizar mientras la tabla sigue en CREATING/UPDATING.
  • Una carrera — dos procesos creando la misma tabla de forma concurrente.

Cómo solucionarlo

  1. Comprueba el estado antes de actuar. DescribeTable → procede solo cuando TableStatus sea ACTIVE; usa un waiter (waitUntilTableExists) para bloquear hasta que se asiente.
  2. Haz idempotente la creación. Captura ResourceInUseException en CreateTable y trátalo como éxito (la tabla que querías existe).
  3. Serializa las operaciones de tabla en pruebas/migraciones para que no se ejecuten dos a la vez; limpia las tablas de prueba en el teardown.

Ejemplo

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

¿Qué significa ResourceInUseException en DynamoDB? Una operación del plano de control (CreateTable, DeleteTable, UpdateTable) apuntó a una tabla que ya existe o sigue en transición por CREATING, UPDATING o DELETING. DynamoDB no aceptará otra operación hasta que la tabla se asiente en ACTIVE.

¿Cómo hago idempotente CreateTable? Captura el ResourceInUseException y trátalo como éxito — la tabla que querías existe. Como alternativa, comprueba primero DescribeTable y crea solo cuando la tabla esté ausente, usando un waiter como waitUntilTableExists para bloquear hasta que se asiente.

Ruta en DynoTable

Cuando una migración vuelve a ejecutar CreateTable, DynoTable muestra la tabla en cuanto existe — ábrela con ⌘KOpen table by name mientras tu script reintenta. Ajustes de la tabla en una pestaña abierta muestra TableStatus (CREATING, UPDATING, ACTIVE) para que esperes a ACTIVE antes de emitir el siguiente cambio del plano de control. Para iterar en local, apunta un perfil Local a http://localhost:8000 (Ejecutar DynamoDB Local) y usa el conversor de DynamoDB JSON para cargar los Items de semilla en cuanto la tabla se asiente.

Para las tablas en la nube atascadas en UPDATING, Ajustes de la tabla también lista los rellenados de GSI en curso — espera a ACTIVE en cada índice antes del siguiente UpdateTable de tu script de despliegue.

Contra DynamoDB Local aparece el mismo ResourceInUseException cuando una prueba vuelve a ejecutar CreateTable sobre una instancia en memoria que nunca se limpió — trata Local como la nube y captura el error o espera a ACTIVE.

Errores relacionados

Fuentes

Trabaja con DynamoDB sin la Consola

Un cliente de escritorio rápido para DynamoDB que ejecuta el SQL real que DynamoDB no puede — JOINs, GROUP BY, agregaciones — con edición visual y un agente de IA con tus propias claves de Bedrock.

Prueba gratuita de 30 días, sin tarjeta — después, el plan Free sin límite de tiempo.