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 帶著 key local、region us-east-1)與你的應用(key fake、region local)因此看到兩個不同的表格集 — 各自「為自己」建立了表格。
  • -inMemory + 重新啟動 — 記憶體模式在磁碟上不保留任何東西;每次重新啟動都是空白資料庫。
  • 沒有掛載 volume 的全新容器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 中)將它掛載為 volume。

  5. 在設定中建立表格 — 對測試而言,在測試套件的啟動流程中建立表格(並等它完成),這樣全新的實例就不會成為意外。

範圍限定問題「看」比「推理」容易得多 — 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 以持久化表格。

相關錯誤

References

最後驗證於 2026-07-13,對照上方連結的 AWS 官方文件。

不必透過主控台就能操作 DynamoDB

DynoTable 是一款快速的 DynamoDB 桌面用戶端 — 瀏覽表格、執行 SQL 風格的查詢,並在本機編輯項目。