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の間にインデックスを作成、削除、または更新する。 - 競合 — 2つのプロセスが同じテーブルを並行して作成する。
修正方法
- 操作前にステータスを確認します。
DescribeTable→TableStatusがACTIVEのときのみ進めます。ウェイター(waitUntilTableExists)を使って落ち着くまでブロックします。 - 作成を冪等にします。
CreateTableでResourceInUseExceptionをキャッチし、成功として扱います(欲しかったテーブルは存在します)。 - テスト/移行で テーブル操作を直列化し、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 は何を意味しますか?
コントロールプレーン操作(CreateTable、DeleteTable、UpdateTable)が、すでに存在する、またはまだ CREATING、UPDATING、DELETING を遷移中のテーブルを対象にしました。DynamoDB は、テーブルが ACTIVE に落ち着くまで別の操作を受け付けません。
CreateTable を冪等にするには?
ResourceInUseException をキャッチして成功として扱います。欲しかったテーブルは存在します。あるいは、まず DescribeTable を確認し、テーブルが不在のときのみ作成します。waitUntilTableExists のようなウェイターを使って落ち着くまでブロックします。
DynoTable での手順
移行が CreateTable を再実行したとき、DynoTable はテーブルが存在した時点でそれを表示します —
スクリプトがリトライしているあいだに ⌘K → Open table by name で開いてください。
開いたタブの テーブル設定 は TableStatus(CREATING、UPDATING、ACTIVE)を表示するので、
次のコントロールプレーンの変更を出す前に ACTIVE を待てます。ローカルで反復するときは、Local の
プロファイルを http://localhost:8000 に向け(DynamoDB Local を動かす)、
テーブルが落ち着いたら DynamoDB JSON コンバーターでシードの
アイテムを読み込みましょう。
クラウドのテーブルが UPDATING から動かないときは、テーブル設定 が進行中の GSI のバックフィルも
一覧します — デプロイスクリプトで次の UpdateTable を出す前に、すべてのインデックスが ACTIVE に
なるのを待ってください。
DynamoDB Local が相手でも、一度もクリアされていないインメモリのインスタンスに対してテストが
CreateTable を再実行すると、同じ ResourceInUseException が出ます — Local もクラウドと同じように
扱い、エラーをキャッチするか ACTIVE を待ちましょう。
関連するエラー
- ResourceNotFoundException — テーブルが存在しない。
- ThrottlingException — コントロールプレーン操作が多すぎる。
- Learn: DynamoDB migrations
出典
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
- CreateTable — Amazon DynamoDB API Reference
- UpdateTable — Amazon DynamoDB API Reference
- DeleteTable — Amazon DynamoDB API Reference
最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。