DynamoDB ResourceInUseException

TL;DR — 이미 존재하거나 아직 전환 중인 테이블(CREATING / UPDATING / DELETING)에서 테이블 작업을 시도했습니다. 먼저 테이블 상태를 확인하거나 "이미 존재함"을 무시하여 생성을 멱등성으로 만듭니다.

무엇을 의미하는가

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

제어 평면 작업(CreateTable, DeleteTable, UpdateTable)에는 테이블이 호환 가능한 상태에 있어야 합니다. 이 오류는 해당 작업이 이미 존재하지 않거나 전환 중이고 DynamoDB가 ACTIVE에 도달할 때까지 다른 작업을 수락하지 않음을 의미합니다. DynamoDB는 이를 HTTP 상태 400으로 반환하며 현재로서는 재시도할 수 없습니다. 즉, 상태가 변경될 때까지 동일한 요청을 다시 시도하면 실패합니다(전환이 완료될 때까지 기다리거나 요청을 변경).

왜 발생하는가

  • 이미 존재하는 테이블에 대해 CreateTable 다시 실행(반복되는 마이그레이션/배포, 정리되지 않는 테스트).
  • 전환 중 작동 — 테이블이 여전히 CREATING/UPDATING인 동안 인덱스 생성, 삭제 또는 업데이트.
  • 경주 — 동일한 테이블을 동시에 생성하는 두 프로세스입니다.

어떻게 해결하는가

  1. 작업하기 전에 상태를 확인하십시오. DescribeTableTableStatusACTIVE인 경우에만 진행하십시오. 웨이터(waitUntilTableExists)를 사용하여 안정될 때까지 차단하세요.
  2. 멱등성을 생성합니다. CreateTable에서 ResourceInUseException을 잡아 성공으로 처리합니다(원하는 테이블이 존재합니다).
  3. 테스트/마이그레이션에서 테이블 작업을 직렬화하여 두 작업이 동시에 실행되지 않도록 합니다. 분해 시 테스트 테이블을 정리합니다.

예제

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

DynamoDB에서 ResourceInUseException은 무엇을 의미합니까? 제어 평면 작업(CreateTable, DeleteTable, UpdateTable)은 이미 존재하거나 여전히 CREATING, UPDATING 또는 DELETING을 통해 전환 중인 테이블을 대상으로 했습니다. DynamoDB는 테이블이 ACTIVE로 확정될 때까지 다른 작업을 허용하지 않습니다.

CreateTable을 멱등성으로 만들려면 어떻게 해야 하나요? ResourceInUseException을 포착하고 이를 성공으로 처리합니다. 원하는 테이블이 존재합니다. 또는 DescribeTable을 먼저 확인하고 테이블이 없는 경우에만 생성하고 waitUntilTableExists와 같은 웨이터를 사용하여 테이블이 안정될 때까지 차단합니다.

DynoTable 경로

마이그레이션이 CreateTable 다시 실행되면 DynoTable은 즉시 테이블을 표시합니다. 존재합니다 — 스크립트를 작성하는 동안 ⌘K이름으로 테이블 열기로 엽니다. 재시도. 열린 탭의 테이블 설정에는 TableStatus(CREATING, UPDATING, ACTIVE) 다음을 발행하기 전에 ACTIVE 동안 기다릴 수 있습니다. 제어 평면 변경. 로컬 반복의 경우 로컬 프로필을 다음 위치로 지정하세요. http://localhost:8000 (Running DynamoDB Local) 및 DynamoDB JSON converter를 사용하여 씨앗을 넣습니다 테이블이 자리를 잡으면 아이템.

UPDATING에 멈춘 클라우드 테이블의 경우 테이블 설정에는 기내 GSI도 나열됩니다. 채우기 — 다음 UpdateTable 전에 모든 인덱스에서 ACTIVE를 기다립니다. 배포 스크립트.

DynamoDB Local에 대해 테스트할 때 동일한 ResourceInUseException가 나타납니다. 결코 지워지지 않은 인메모리 인스턴스에 대해 CreateTable을 다시 실행합니다. 클라우드처럼 로컬에서 오류를 포착하거나 ACTIVE을 기다립니다.

관련 오류

출처

Console 없이 DynamoDB 작업하기

DynamoDB로는 실행할 수 없는 진짜 SQL(JOINs, GROUP BY, 집계)을 실행하는 빠른 DynamoDB 데스크톱 클라이언트. 시각적 편집과 여러분 자신의 Bedrock 키로 동작하는 AI 에이전트를 제공합니다.

30일 무료 체험, 신용카드 불필요 — 이후 기간 제한 없는 무료 요금제.