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 驗證)