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 agent。

30 天免费试用,无需信用卡 — 之后为无时间限制的免费版。