Local secondary indexes must be specified at table creation

TL;DR — Bir yerel ikincil indeks (LSI) yalnızca tablosunun oluşturulduğu anda oluşturulabilir; daha sonra eklenemez, değiştirilemez veya kaldırılamaz. UpdateTable'ın LSI'ler için bir işlemi yoktur, bu yüzden canlı bir tabloya bir LSI ekleme girişimi doğrulamayı geçemez. Yeni bir LSI almak için (LSI ile) yeni bir tablo oluşturmalı ve verileri taşımalısınız — ya da çevrimiçi eklenebilen bir global ikincil indeks (GSI) kullanmalısınız.

Ne anlama gelir

ValidationException: One or more parameter values were invalid: Local secondary
indexes can only be created when a table is created

Bir LSI, bölüm anahtarını temel tabloyla paylaşır ve alternatif bir sıralama anahtarı ekler; DynamoDB onu yazma sırasında öğenin bölümüyle aynı yere yerleştirir. Bu fiziksel bağlaşım nedeniyle bir LSI, tablonun ilk yazmasından itibaren var olmalıdır — UpdateTable, GSI ekleme/kaldırma işlemini destekler ama hiçbir LSI parametresine sahip değildir, bu yüzden sonradan eklemek için gönderebileceğiniz bir istek bile yoktur. Tam mesaj yola göre değişir (bir SDK/CLI çağrısı istemci tarafında parametre doğrulamasını geçemeyebilir; IaC araçları kendi ifadelerini gösterir), ancak hizmet tarafındaki biçimi bir HTTP 400 ValidationException'dır ve yeniden denenebilir değildir: işlem, mevcut bir tabloda basitçe desteklenmez.

Neden olur

  • Canlı bir tabloya LSI eklemek — zaten var olan bir tabloya yeni bir LocalSecondaryIndexes girişi eklemek için UpdateTable çağırmak (ya da bir CloudFormation/Terraform şablonunu düzenlemek).
  • Mevcut bir LSI'yi değiştirmek — anahtar şeması veya projeksiyonu oluşturmada sabittir; düzenlemeler reddedilir.
  • Güncelleme yerine yeniden oluşturan bir IaC farkı — araç, DynamoDB'nin yalnızca oluşturma zamanında izin verdiği bir LSI değişikliğini yerinde güncellemeye çalışır.

Nasıl düzeltilir

  1. Önceden tanımlanmış LSI ile yeni bir tablo oluşturun, sonra verileri taşıyın (tara-ve-yaz ya da talep üzerine dışa/içe aktarma).
  2. Erişim deseni izin veriyorsa bunun yerine bir GSI kullanın — GSI'ler mevcut bir tabloya çevrimiçi eklenebilir ve aynı bölüm anahtarını gerektirmez:
    aws dynamodb update-table --table-name <Table> \
      --attribute-definitions AttributeName=gsi_sk,AttributeType=S \
      --global-secondary-index-updates '[{"Create":{"IndexName":"gsi1", ...}}]'
  3. LSI'leri modelleme sırasında planlayın — alternatif sıralama anahtarlarına tablo var olmadan önce karar verin, çünkü sonradan eklenemezler.

DynoTable'da boyutu kontrol edin

LSI için bir tabloyu yeniden oluşturmadan önce DynoTable'daki erişim modelini doğrulayın; ⌘K ile tabloyu açın ve GSI sorgusunun aynı ihtiyacı karşılayıp karşılamadığını test edin. Query Builder yeni endeksinizin sunması gereken KeyConditionExpression değerini oluşturur.

LSI yazma yükseltmesini GSI alternatifiyle karşılaştırmak için pricing calculator'yi kullanın. Profilleri ⌘P ile değiştirin; bkz. Connect to AWS ve Install.

Kaynaklar

İlgili hatalar

Kaynaklar

En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.

Console olmadan DynamoDB ile çalış

DynamoDB’nin çalıştıramadığı gerçek SQL’i çalıştıran hızlı bir DynamoDB masaüstü istemcisi — JOINs, GROUP BY, toplamalar — görsel düzenleme ve kendi Bedrock anahtarların üzerinde bir yapay zekâ aracısıyla.

30 günlük ücretsiz deneme, kredi kartı yok — ardından süre sınırı olmayan Ücretsiz plan.