Orta6 dakikalık okuma

DynamoDB Local ve LocalStack'e Nasıl Bağlanılır

Çalışan bir local DynamoDB'niz var ve kodunuz onunla sorunsuz konuşuyor — ancak her seferinde bir scan betiği yazmak yerine tabloları görmek istiyorsunuz. Bir istemciyi bir local endpoint'e bağlamak iki değişikliktir: doğru URL'ye yönlendirin ve ona bir kullan-at kimlik bilgisi verin. Aşağıdaki ayrıntılar, insanların takıldığı yerlerdir — bölge ad alanı, alfanümerik-anahtar kuralı ve 8000 ile 4566 port ayrımı.

DynamoDB Local ve LocalStack: neye bağlanıyorsunuz

Her ikisi de localhost üzerinde AWS hesabı olmadan bir DynamoDB API'si sunar, ancak farklı şeylerdir:

Yani bağlanmak için tek pratik fark endpoint URL'sidir: bağımsız DynamoDB Local için :8000, LocalStack üzerinden DynamoDB için :4566. Diğer her şey — API, kimlik bilgisi hilesi, GUI yapılandırması — aynıdır.

Herkesin takıldığı endpoint + sahte kimlik bilgisi kurulumu

AWS SDK'leri ve CLI, bir local endpoint ile konuşurken bile bir erişim anahtarı ve bir bölge gerektirir — ancak bu değerlerin gerçek olması gerekmez. AWS'nin kendi belgeleri, bu değerlerin "local olarak çalışmak için geçerli AWS değerleri olması gerekmediğini" söyler (AWS docs).

Belirgin olmayan iki tuzak:

  • Bölge/erişim anahtarı verilerinizi sessizce ad alanına ayırır. -sharedDb bayrağı olmadan, DynamoDB Local her erişim-anahtarı-kimliği + bölge kombinasyonu için ayrı bir myaccesskeyid_region.db dosyası yazar — AWS'nin tam adlandırması. Uygulamanızın kullandığından farklı bir anahtar veya bölge ile bağlanın, tablolarınız kaybolmuş gibi görünür; sadece başka bir dosyadadırlar. -sharedDb ile çalıştırın (her istemci için tek bir shared-local-instance.db) veya uygulamanızın kullandığı anahtar + bölgeyle tam olarak eşleştirin.
  • Erişim anahtarı kimliği DynamoDB Local'de alfanümerik olmalıdır — sembol yok. AWS docs, AWS_ACCESS_KEY_ID'nin yalnızca A–Z, a–z ve 0–9 içerebileceğini belirtir; AWS bunu DynamoDB Local 2.0.0'da (ve 1.23.0+) tanıttı, bu yüzden daha eski bir imajda çalışan özel karakterli bir anahtar artık başarısız olur (AWS re:Post). Aşağıdaki hataya bakın.

LocalStack için güvenli varsayılan test / test'tir: gizli anahtarı tamamen görmezden gelir ve gizli değeri asla doğrulamaz. Gerçek görünümlü AKIA…/ASIA… anahtarları bir önlem olarak reddedilir ve sahte hesap 000000000000'a geri dönertest gibi rastgele bir anahtarın çözümlendiği aynı hesap. test ile kalın.

AWS CLI ile bağlanma (sağlık kontrolü)

Bir GUI'yi ona yönlendirmeden önce, endpoint'in CLI'dan canlı olduğunu doğrulayın. CLI'nin yerleşik varsayılan local endpoint'i yoktur, bu yüzden komut başına --endpoint-url iletin veya AWS_ENDPOINT_URL_DYNAMODB=http://localhost:8000 ayarlayın (CLI v2.13+).

DynamoDB Local:

aws dynamodb list-tables --endpoint-url http://localhost:8000

LocalStack (aynı komut, farklı port):

aws dynamodb list-tables --endpoint-url http://localhost:4566

Hiç kimlik bilgisi yapılandırılmışsa (hatta ~/.aws/credentials içinde veya AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY aracılığıyla sahte olanlar bile), bu tablo listenizi döndürür. Hatasız boş bir liste, endpoint'in çalıştığı ancak farklı bir anahtar/bölge ad alanına baktığınız anlamına gelir — yukarıdaki tuzağa bakın.

DynamoDB Local GUI: DynoTable'da local tabloları görüntüleme ve sorgulama

CLI çalıştığında, bir GUI aynı üç değere ihtiyaç duyar: endpoint, bölge ve herhangi bir sahte kimlik bilgisi. CLI, gözle okuduğunuz DynamoDB-JSON döndürür; bir GUI ise aynı veriyi sıralayabileceğiniz, filtreleyebileceğiniz ve düzenleyebileceğiniz bir tablo olarak işler.

DynoTable'da bir bağlantı ekleyin ve özel bir endpoint ayarlayın:

  • Endpoint: http://localhost:8000 (DynamoDB Local) veya http://localhost:4566 (LocalStack)
  • Bölge: uygulamanızın kullandığı her ne ise — örneğin us-east-1. Burada bir etikettir, gerçek bir AWS bölgesi değil, ancak aynı veri ad alanına inmeniz için eşleşmelidir.
  • Erişim anahtarı / gizli anahtar: herhangi bir şey (test / test gelenekseldir). DynamoDB Local'de erişim anahtarı için yalnızca alfanümerik.

Oradan item'ları görüntüler, bir Query veya Scan çalıştırır ve satırları CLI'da elle JSON yapmak yerine görsel olarak düzenlersiniz. Fixture yüklediğinizde, DynamoDB-JSON dönüştürücü düz JSON'u tel biçimine çevirir ve Query ve Scan hangi okumaya başvuracağınızı ele alır. Bir LocalStack DynamoDB görüntüleyicisi için aynı işlem — yalnızca port 4566 olarak değişir.

DynoTable yalnızca-local masaüstü yazılımıdır, bu yüzden onu localhost'a yönlendirmek fixture'larınızı makinenizde tutar. GUI ortamına daha geniş bir bakış için DynamoDB GUI karşılaştırması sayfasına bakın.

Yaygın hatalar (bölge uyuşmazlığı, port, kimlik bilgileri)

  • Connection refused. Yanlış port — 8000 DynamoDB Local, 4566 LocalStack'tir. Ayrıca konteynerin portu gerçekten yayımladığını doğrulayın (docker run -p 8000:8000 amazon/dynamodb-local). LocalStack için, servisin http://localhost:4566/_localstack/health adresinde çalıştığını kontrol edin.
  • DynamoDB Local'de The Access Key ID or Security Token is Invalid. 2.0.0 (ve 1.23.0+) imajından bu yana, erişim anahtarı kimliği yalnızca alfanümerik olmalıdır. Daha eski bir imajda çalışan sembollü bir anahtar artık başarısız olur — onu harf/rakamlarla değiştirin (örneğin test) ve her aracı eşleşecek şekilde güncelleyin.
  • LocalStack'e karşı The security token included in the request is invalid. Bu neredeyse her zaman bir endpoint sorunudur, bir kimlik bilgisi sorunu değil — SDK istemciniz --endpoint-url / endpoint_url'i düşürdü ve sahte anahtarınızı reddeden gerçek AWS endpoint'ine gitti. İstemcinin gerçekten http://localhost:4566'ya yönlendirildiğini doğrulayın.
  • SDK/CLI'dan kimlik bilgisi hataları. Local endpoint'ler bile bazı kimlik bilgilerinin mevcut olmasını gerektirir. SDK'nın kimlik bilgisi zincirinin çözümlenmesi için AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY (veya sahte bir profil) ayarlayın.
  • http ile https. Local endpoint'ler düz http'dir. Bir https:// URL'si TLS el sıkışmasında başarısız olur.

DynamoDB Local, gerçek AWS tablolarımla aynı veri mi?

Hayır — local ve bulut tamamen ayrı depolardır. DynamoDB Local (ve LocalStack'in DynamoDB'si) veriyi bir local dosyada veya bellekte tutar; asla AWS hesabınıza dokunmaz ve AWS Bölgeleri/hesapları local olarak istemci düzeyinde desteklenmez. Amaç bu: geliştirme ve test içindir. Aynı fixture'ları daha sonra bulutta istiyorsanız, AWS önerir ki local olarak geçerli görünümlü anahtar/bölge değerleri kullanın, böylece taşındığınızda yalnızca endpoint'i değiştirirsiniz. O şemayı göndermeden önce modellemek için, single-table design ve GSI ve LSI, local ile üretim arasında değişmeyen kararları ele alır.

Local'in size kazandırdıkları (ve üretimin faturalandırmaya devam ettikleri)

DynamoDB Local hiçbir şeyi ölçmez — RCU yok, WCU yok, transfer yok. Aynı GetItem, us-east-1 bölgesindeki yönetilen DynamoDB'de on-demand modda ≤ 4 KB bir item için nihai tutarlı okumada 0,5 RCU, güçlü tutarlı okumada 1 RCU faturalandırır. --endpoint-url'i gerçek endpoint ile değiştirdiğinizde, her görüntüleme ve sorgu yeniden faturalandırılmaya başlar. Bu geçişi fiyatlandırma hesaplayıcısı ile modelleyin ve temsili item'ları item boyutu hesaplayıcısı ile boyutlandırın.

SSS

Gerçek AWS kimlik bilgilerine ihtiyacım var mı? Hayır. Hem DynamoDB Local hem de LocalStack sahte değerleri kabul eder. Yalnızca mevcut olmaları, alfanümerik olmaları (DynamoDB Local için) ve araçlarınız genelinde tutarlı olmaları gerekir.

Araç değiştirdiğimde tablolarım neden kayboluyor? -sharedDb olmadan, DynamoDB Local veriyi erişim anahtarı + bölgeye göre ayrı myaccesskeyid_region.db dosyalarına böler. -sharedDb kullanın veya bu değerleri her yerde aynı tutun.

8000 ve 4566 portları arasındaki fark nedir? 8000, bağımsız DynamoDB Local'in varsayılanıdır; 4566, DynamoDB dahil tüm taklit edilen servislerinin önünde duran LocalStack'in tek edge portudur.

Tek bir GUI her ikisine de bağlanabilir mi? Evet — aynı DynamoDB API'sini konuşurlar. Yalnızca endpoint URL'si değişir (:8000 ve :4566).

DynamoDB Local ücretsiz mi? Evet. AWS, DynamoDB Local'i bir JAR ve bir Docker imajı olarak ücretsiz dağıtır — "sağlanan verim, veri depolama veya veri transferi maliyeti yoktur"; yalnızca geliştirme ve test için tasarlanmıştır, üretim için değil.

Local tablolarıma karşı SQL çalıştırabilir miyim? Local DynamoDB, bulutla aynı API'yi konuşur, bu yüzden aynı erişim modeli kuralları geçerlidir — ve aynı sınırlar: DynamoDB'nin PartiQL SELECT dilbilgisi yalnızca SELECT … FROM … WHERE … ORDER BY şeklindedir — JOIN yok, GROUP BY yok ve COUNT/SUM/AVG gibi gruplama agregasyon fonksiyonları yok (bkz. PartiQL ile SQL). DynoTable'ın 'i bu analitik sorguları local dahil herhangi bir bağlantı üzerinde çalıştırır.

DynoTable'ı deneyin ve doğrudan localhost:8000 veya localhost:4566'ya bağlanarak local tablolarınızı bir GUI ile görüntüleyin, sorgulayın ve düzenleyin.

Güncellendi