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

コントロールプレーン操作(CreateTableDeleteTableUpdateTable)は、テーブルが互換性のある状態にあることを要求します。このエラーはそうでないことを意味します。すでに存在するか、遷移の途中で、DynamoDB は ACTIVE に落ち着くまで別の操作を受け付けません。DynamoDB はこれを HTTP ステータス 400 で返し、そのままではリトライ不可です。同一のリクエストを再試行しても、状態が変わるまで失敗します(遷移が完了するのを待つか、リクエストを変更します)。

発生する理由

  • すでに存在するテーブルに対して CreateTable を再実行(繰り返しの移行/デプロイ、クリーンアップしないテスト)。
  • 遷移中の操作 — テーブルがまだ CREATING/UPDATING の間にインデックスを作成、削除、または更新する。
  • 競合 — 2つのプロセスが同じテーブルを並行して作成する。

修正方法

  1. 操作前にステータスを確認します。 DescribeTableTableStatusACTIVE のときのみ進めます。ウェイター(waitUntilTableExists)を使って落ち着くまでブロックします。
  2. 作成を冪等にします。 CreateTableResourceInUseException をキャッチし、成功として扱います(欲しかったテーブルは存在します)。
  3. テスト/移行で テーブル操作を直列化し、2つが同時に実行されないようにします。ティアダウンでテストテーブルをクリーンアップします。

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.
}

よくある質問

DynamoDB で ResourceInUseException は何を意味しますか? コントロールプレーン操作(CreateTableDeleteTableUpdateTable)が、すでに存在する、またはまだ CREATING、UPDATING、DELETING を遷移中のテーブルを対象にしました。DynamoDB は、テーブルが ACTIVE に落ち着くまで別の操作を受け付けません。

CreateTable を冪等にするには? ResourceInUseException をキャッチして成功として扱います。欲しかったテーブルは存在します。あるいは、まず DescribeTable を確認し、テーブルが不在のときのみ作成します。waitUntilTableExists のようなウェイターを使って落ち着くまでブロックします。

DynoTable での手順

移行が CreateTable を再実行したとき、DynoTable はテーブルが存在した時点でそれを表示します — スクリプトがリトライしているあいだに ⌘KOpen table by name で開いてください。 開いたタブの テーブル設定TableStatusCREATINGUPDATINGACTIVE)を表示するので、 次のコントロールプレーンの変更を出す前に ACTIVE を待てます。ローカルで反復するときは、Local の プロファイルを http://localhost:8000 に向け(DynamoDB Local を動かす)、 テーブルが落ち着いたら DynamoDB JSON コンバーターでシードの アイテムを読み込みましょう。

クラウドのテーブルが UPDATING から動かないときは、テーブル設定 が進行中の GSI のバックフィルも 一覧します — デプロイスクリプトで次の UpdateTable を出す前に、すべてのインデックスが ACTIVE に なるのを待ってください。

DynamoDB Local が相手でも、一度もクリアされていないインメモリのインスタンスに対してテストが CreateTable を再実行すると、同じ ResourceInUseException が出ます — Local もクラウドと同じように 扱い、エラーをキャッチするか ACTIVE を待ちましょう。

関連するエラー

出典

最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。

Console なしで DynamoDB を扱う

DynamoDB では実行できない本物の SQL(JOINs、GROUP BY、集計)を実行する高速な DynamoDB デスクトップクライアント。ビジュアル編集と、あなた自身の Bedrock キーで動く AI エージェントを備えています。

30日間無料トライアル、クレジットカード不要 — その後は期限のない Free プラン。