Cannot do operations on a non-existent table (DynamoDB Local)

TL;DR — 这是 DynamoDB Local 对 ResourceNotFoundException 的措辞,而陷阱在于"non-existent"的范围被限定在这个实例为你当前的访问密钥 + 区域所打开的那个数据库文件内。没有 -sharedDb 时,Local 会为每个凭证/区域组合保留一套_独立的_表——所以你用 CLI 创建的表对你的应用可能是不可见的。用 -sharedDb 运行 Local(或者在各处固定完全相同的虚拟凭证 + 区域),并记住 -inMemory 每次重启都从空开始。

含义

ResourceNotFoundException: Cannot do operations on a non-existent table

你的请求到达了一个正在运行的 DynamoDB Local,它查找了表却没找到——在它为你请求的身份所使用的那个数据库中。真实的 AWS 对同样的失败措辞不同(Requested resource not found),因此这条确切的消息强烈暗示你正在与一个模拟器对话。

为什么会发生

  • 凭证/区域的裂脑(经典情形)。 没有 -sharedDb 时,DynamoDB Local 会以每个请求的访问密钥 ID 和区域来命名其数据库文件。因此你的 CLI(--profile 用密钥 local、区域 us-east-1)和你的应用(密钥 fake、区域 local)会看到两套不同的表——各自"为自己"创建了那张表。
  • -inMemory + 重启——内存模式不在磁盘上保留任何东西;每次重启都是一个空白数据库。
  • 一个没有卷的全新容器——docker run amazon/dynamodb-local 从空开始;上一个容器的表都没了,除非你挂载了 -dbPath 存储。
  • 表确实没被创建——安装脚本没运行,或者是针对不同的端口/实例创建的。
  • 同一份代码分别指向真实 AWS 和 Local——表在云端存在但在模拟器中不存在(或反之)。

如何修复

  1. 看看这个身份能看到什么——用你的应用实际使用的确切凭证/区域/端点列出表:

    AWS_ACCESS_KEY_ID=local AWS_SECRET_ACCESS_KEY=local \
    aws dynamodb list-tables --endpoint-url http://localhost:8000 --region us-east-1

    如果表在这里缺失但"某处"存在,那就是范围限定问题。

  2. -sharedDb 运行 Local,让每个客户端无论凭证/区域如何都共享一个数据库:

    java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb
    # docker: docker run -p 8000:8000 amazon/dynamodb-local -jar DynamoDBLocal.jar -sharedDb
  3. 或者在各处固定一个身份——在 CLI profile、SDK 客户端配置和测试设置中使用相同的虚拟 accessKeyIdsecretAccessKeyregion

  4. 跨重启持久化——去掉 -inMemory,设置 -dbPath,并(在 Docker 中)把它挂载为一个卷。

  5. 在安装时创建表——对于测试,在测试套件的引导过程中创建表(并等待它就绪),这样一个全新的实例永远不会带来意外。

范围限定问题_看_起来比推断出来容易得多——DynoTable 桌面应用连接到 DynamoDB Local,并准确显示某个端点 + 凭证组合能看到哪些表,因此裂脑一眼就能看出来。在准备种子数据?DynamoDB JSON 转换器能把普通 JSON 转成带类型的项目。

DynoTable + Local

范围界定问题更容易“看到”而不是推断。 Install DynoTable, 添加带有端点的本地配置文件(设置→配置文件→添加Profilehttp://localhost:8000 和你的 CLI 使用的相同访问密钥 + 区域,然后将侧边栏表列表与 aws dynamodb list-tables --endpoint-url 进行比较 http://localhost:8000。凭据不匹配将表拆分为不同的表 myaccesskeyid_region.db 文件 (Running DynamoDB Local)。 -inMemory重启后,使用DynamoDB JSON converter 重新加载夹具。

常见问题

为什么刚创建的时候DynamoDBLocal就说表不存在? 如果没有 -sharedDb,DynamoDB Local 会为每个访问密钥 ID 和区域保留一个单独的数据库文件,因此,如果凭据或区域不同,你使用 CLI 创建的表对你的应用程序来说是不可见的。使用 -sharedDb 运行本地或在各处固定相同的虚拟凭据和区域。

为什么我的DynamoDB本地表重启后就消失了?-inMemory 模式下,磁盘上不会保留任何内容,因此每次重新启动都是一个空白数据库。没有安装卷的新 Docker 容器也开始为空。删除-inMemory,设置-dbPath,并将其挂载为卷以持久保存表。

相关错误

来源

无需控制台即可使用 DynamoDB

一款快速的 DynamoDB 桌面客户端,可运行 DynamoDB 无法执行的真正 SQL——JOINs、GROUP BY、聚合——并支持可视化编辑和运行在你自己的 Bedrock 密钥上的 AI agent。

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