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 時建立索引、刪除或更新。
  • 一次競速——兩個程序並行建立同一張表。

如何修正

  1. 在操作之前檢查狀態。 DescribeTable → 只有當 TableStatusACTIVE 時才繼續;使用一個等待器(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.
}

常見問題

ResourceInUseException 在 DynamoDB 中意味著什麼? 控制平面操作(CreateTableDeleteTableUpdateTable)針對已存在或仍在透過 CREATING、UPDATING 或 DELETING 進行轉換的表。在表穩定為 ACTIVE 之前,DynamoDB 不會接受其他操作。

如何使 CreateTable 冪等? 捕獲 ResourceInUseException 並將其視為成功 — 你想要的表存在。或者首先檢查DescribeTable,並且僅在桌子不存在時建立,使用像waitUntilTableExists這樣的服務員來阻塞,直到它解決。

DynoTable 中的路徑

當遷移重新執行 CreateTable 時,DynoTable 會立即顯示該表存在 — 使用 ⌘K 開啟它 → 在指令碼中按名稱開啟表 重試。開啟選項卡上的 表格設定 顯示 TableStatusCREATINGUPDATINGACTIVE),這樣你就可以等待ACTIVE,然後再發出下一個控制平面的變化。對於本地迭代,將本地設定檔案指向 http://localhost:8000 (Running DynamoDB Local) 和使用DynamoDB JSON converter在資料表穩定後載入種子項目。對於停留在 UPDATING 的雲表,表格設定 還會列出正在執行的 GSI 回填 — 在每個索引上等待 ACTIVE,然後再進行下一個 UpdateTable 你的部署指令碼。針對DynamoDB Local,測試時會出現相同的ResourceInUseException 針對從未清除的記憶體例項重新執行 CreateTable — treat 本地(如雲)並捕獲錯誤或等待 ACTIVE

相關錯誤

來源

不必透過主控台就能操作 DynamoDB

一款快速的 DynamoDB 桌面用戶端,可執行 DynamoDB 無法執行的真正 SQL — JOINs、GROUP BY、聚合 — 並支援視覺化編輯與使用你自己的 Bedrock 金鑰的 AI 代理。

30 天免費試用,無需信用卡 — 之後為無時間限制的免費方案。