Cannot do operations on a non-existent table (DynamoDB Local)
TL;DR — 這是 DynamoDB Local 對 ResourceNotFoundException 的措辭,而陷阱在於「non-existent」的範圍限定於這個實例為你目前的 access key + region 所開啟的資料庫檔案。若不使用 -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 會依每個請求的 access key ID 與 region 為其資料庫檔案命名。你的 CLI(--profile帶著 keylocal、regionus-east-1)與你的應用(keyfake、regionlocal)因此看到兩個不同的表格集 — 各自「為自己」建立了表格。 -inMemory+ 重新啟動 — 記憶體模式在磁碟上不保留任何東西;每次重新啟動都是空白資料庫。- 沒有掛載 volume 的全新容器 —
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 中)將它掛載為 volume。在設定中建立表格 — 對測試而言,在測試套件的啟動流程中建立表格(並等它完成),這樣全新的實例就不會成為意外。
範圍限定問題「看」比「推理」容易得多 — DynoTable 桌面應用程式連到 DynamoDB Local,並精確顯示某個端點 + 憑證組合看得到哪些表格,讓腦裂一眼可見。準備種子資料嗎?DynamoDB JSON 轉換器可將純 JSON 轉為帶型別的項目。
FAQ
為什麼我剛建立表格,DynamoDB Local 卻說它不存在?
若不使用 -sharedDb,DynamoDB Local 會為每個 access key ID 與 region 保留各自的資料庫檔案,因此如果 CLI 與你的應用的憑證或區域不同,你用 CLI 建立的表格對應用可能是看不見的。以 -sharedDb 執行 Local,或在各處固定使用相同的假憑證與區域。
為什麼我的 DynamoDB Local 表格在重新啟動後消失了?
在 -inMemory 模式下磁碟上不保留任何東西,因此每次重新啟動都是空白資料庫。沒有掛載 volume 的全新 Docker 容器也是從空的開始。移除 -inMemory、設定 -dbPath,並將它掛載為 volume 以持久化表格。
相關錯誤
- 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 官方文件。