Cannot do operations on a non-existent table (DynamoDB Local)
TL;DR — Bu, DynamoDB Local'in ResourceNotFoundException için kullandığı ifadedir ve tuzak şudur: "var olmayan", bu örneğin mevcut erişim anahtarınız + bölgeniz için açtığı veritabanı dosyasıyla sınırlıdır. -sharedDb olmadan Local, kimlik bilgileri/bölge kombinasyonu başına ayrı bir tablo kümesi tutar — dolayısıyla CLI ile oluşturduğunuz tablo, uygulamanıza görünmez olabilir. Local'i -sharedDb ile çalıştırın (veya her yerde birebir aynı kukla kimlik bilgileri + bölgeyi sabitleyin) ve -inMemory'nin her yeniden başlatmada boş başladığını unutmayın.
Ne anlama gelir
ResourceNotFoundException: Cannot do operations on a non-existent tableİsteğiniz, çalışan bir DynamoDB Local'e ulaştı; o da tabloyu aradı ve bulamadı — isteğinizin kimliği için kullandığı veritabanında. Gerçek AWS aynı hatayı farklı ifade eder (Requested resource not found), bu yüzden tam olarak bu mesaj, bir emülatörle konuştuğunuza dair güçlü bir ipucudur.
Neden olur
- Kimlik bilgisi/bölge bölünmüş beyin (klasik).
-sharedDbolmadan DynamoDB Local, veritabanı dosyasını her isteğin erişim anahtarı kimliği ve bölgesine göre adlandırır. Dolayısıyla CLI'nız (anahtarılocal, bölgesius-east-1olan--profile) ve uygulamanız (anahtarıfake, bölgesilocal) iki farklı tablo kümesi görür — her biri tabloyu "kendisi için" oluşturdu. -inMemory+ bir yeniden başlatma — bellek içi mod diskte hiçbir şey tutmaz; her yeniden başlatma boş bir veritabanıdır.- Birim olmadan yeni bir kapsayıcı —
docker run amazon/dynamodb-localboş başlar;-dbPathdepolamasını bağlamadıkça önceki kapsayıcının tabloları gitmiştir. - Tablo gerçekten oluşturulmadı — kurulum betikleri çalışmadı ya da farklı bir port/örneğe karşı oluşturuldu.
- Aynı kod gerçek AWS'ye karşı Local'e yöneltilmiş — tablo bulutta var ama emülatörde yok (ya da tersi).
Nasıl düzeltilir
BU kimliğin ne gördüğünü görün — tabloları tam olarak uygulamanızın kullandığı kimlik bilgileri/bölge/uç noktayla listeleyin:
AWS_ACCESS_KEY_ID=local AWS_SECRET_ACCESS_KEY=local \ aws dynamodb list-tables --endpoint-url http://localhost:8000 --region us-east-1Tablo burada eksik ama "bir yerde" varsa, sorun kapsamlandırmadır.
Local'i
-sharedDbile çalıştırın ki her istemci, kimlik bilgileri/bölgeden bağımsız olarak tek bir veritabanı paylaşsın:java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb # docker: docker run -p 8000:8000 amazon/dynamodb-local -jar DynamoDBLocal.jar -sharedDbYa da her yerde tek bir kimliği sabitleyin — CLI profilinde, SDK istemci yapılandırmasında ve test kurulumunda aynı kukla
accessKeyId,secretAccessKeyveregion.Yeniden başlatmalar boyunca kalıcı kılın —
-inMemory'yi bırakın,-dbPathayarlayın ve (Docker'da) bir birim olarak bağlayın.Tabloları kurulumda oluşturun — testler için, tabloyu (ve beklemeyi) paketin önyüklemesinde oluşturun, böylece yeni bir örnek asla sürpriz olmasın.
Kapsamlandırma sorununu çıkarımlamaktan çok görmek çok daha kolaydır — DynoTable masaüstü uygulaması DynamoDB Local'e bağlanır ve bir uç nokta + kimlik bilgisi kombinasyonunun tam olarak hangi tabloları görebildiğini gösterir, böylece bölünmüş beyin bir bakışta görünür. Tohum verisi hazırlıyor musunuz? DynamoDB JSON dönüştürücüsü düz JSON'u türlü öğelere dönüştürür.
SSS
DynamoDB Local, henüz oluşturduğum tablonun var olmadığını neden söylüyor?
-sharedDb olmadan DynamoDB Local, erişim anahtarı kimliği ve bölge başına ayrı bir veritabanı dosyası tutar, bu yüzden CLI ile oluşturduğunuz tablo, kimlik bilgileri veya bölgesi farklıysa uygulamanıza görünmez olabilir. Local'i -sharedDb ile çalıştırın ya da her yerde birebir aynı kukla kimlik bilgileri ve bölgeyi sabitleyin.
DynamoDB Local tablolarım bir yeniden başlatmadan sonra neden kayboldu?
-inMemory modunda diskte hiçbir şey tutulmaz, bu yüzden her yeniden başlatma boş bir veritabanıdır. Bağlı bir birim olmadan yeni bir Docker kapsayıcısı da boş başlar. Tabloları kalıcı kılmak için -inMemory'yi bırakın, -dbPath ayarlayın ve bir birim olarak bağlayın.
İlgili hatalar
- ResourceNotFoundException — gerçek AWS sürümü (yanlış bölge/hesap/tablo adı).
- Could not connect to DynamoDB Local (ECONNREFUSED)
- DynamoDB Local port 8000 in use
- Öğrenin: 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)
En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.