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——表在云端存在但在模拟器中不存在(或反之)。
如何修复
看看这个身份能看到什么——用你的应用实际使用的确切凭证/区域/端点列出表:
AWS_ACCESS_KEY_ID=local AWS_SECRET_ACCESS_KEY=local \ aws dynamodb list-tables --endpoint-url http://localhost:8000 --region us-east-1如果表在这里缺失但"某处"存在,那就是范围限定问题。
用
-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或者在各处固定一个身份——在 CLI profile、SDK 客户端配置和测试设置中使用相同的虚拟
accessKeyId、secretAccessKey和region。跨重启持久化——去掉
-inMemory,设置-dbPath,并(在 Docker 中)把它挂载为一个卷。在安装时创建表——对于测试,在测试套件的引导过程中创建表(并等待它就绪),这样一个全新的实例永远不会带来意外。
范围限定问题_看_起来比推断出来容易得多——DynoTable 桌面应用连接到 DynamoDB Local,并准确显示某个端点 + 凭证组合能看到哪些表,因此裂脑一眼就能看出来。在准备种子数据?DynamoDB JSON 转换器能把普通 JSON 转成带类型的项目。
FAQ
为什么 DynamoDB Local 说表不存在,可我刚刚才创建了它?
没有 -sharedDb 时,DynamoDB Local 会为每个访问密钥 ID 和区域保留一个独立的数据库文件,因此如果凭证或区域不同,你用 CLI 创建的表对你的应用可能是不可见的。用 -sharedDb 运行 Local,或者在各处固定完全相同的虚拟凭证和区域。
为什么我的 DynamoDB Local 表在重启后消失了?
在 -inMemory 模式下,没有任何东西保留在磁盘上,因此每次重启都是一个空白数据库。一个没有挂载卷的全新 Docker 容器同样从空开始。去掉 -inMemory,设置 -dbPath,并把它挂载为一个卷来持久化表。
相关错误
- ResourceNotFoundException——真实 AWS 版本(区域/账户/表名错误)。
- Could not connect to DynamoDB Local (ECONNREFUSED)
- DynamoDB Local port 8000 in use
- 学习:Running DynamoDB Local · Connect to Local & LocalStack
References
- DynamoDB local usage notes — AWS DynamoDB Developer Guide (per-credential/Region
myaccesskeyid_region.dbfiles,-sharedDb→shared-local-instance.db,-inMemorykeeps nothing on disk) - Deploying DynamoDB locally on your computer — AWS DynamoDB Developer Guide (Docker Compose
-sharedDb -dbPath ./data+ volume pattern, dummy credentials) - amazon/dynamodb-local — Docker Hub (official image; fresh containers start empty without a mounted volume)
最后核实于 2026-07-13,依据上方链接的 AWS 官方文档。