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 转成带类型的项目。
DynoTable + Local
范围界定问题更容易“看到”而不是推断。 Install DynoTable,
添加带有端点的本地配置文件(设置→配置文件→添加Profile)
http://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,并将其挂载为卷以持久保存表。
相关错误
- ResourceNotFoundException——真实 AWS 版本(区域/账户/表名错误)。
- Could not connect to DynamoDB Local (ECONNREFUSED)
- DynamoDB Local 的 8000 端口被占用
- 学习:Running DynamoDB Local · Connect to Local & LocalStack
来源
- DynamoDB local usage notes — Amazon DynamoDB Developer Guide(已于 2026 年 7 月 13 日验证 —
-sharedDb、-inMemory,每个凭证数据库文件) - Deploying DynamoDB locally on your computer — Amazon DynamoDB Developer Guide(2026-07-13 验证)
- amazon/dynamodb-local — Docker Hub(2026-07-13 验证)