DynamoDB Streams
DynamoDB Streams, bir change-data-capture günlüğüdür: bir tablodaki her ekleme, güncelleme ve silme, tepki verebileceğiniz bir kayıt akışı olarak, sırayla yakalanır. Bir tabloyu, onu yoklamadan bir olay kaynağına dönüştürmenin yoludur.
Denetim günlüğü senaryosunda, hassas bir olay düştüğü anda tepki vermek istersiniz — biri bir fatura dışa aktardığında ya da bir yönetici rolü verdiğinde bir uyarı tetikleyin — tabloyu bir zamanlayıcıda taramadan. Streams bunun itme tarafıdır.
DynamoDB Streams nasıl çalışır?
DynamoDB Streams, bir tablodaki her ekleme, güncelleme ve silme işlemini 24 saate kadar saklanan zaman sıralı, tekilleştirilmiş bir kayıt günlüğü olarak yakalar. StreamViewType ile her kaydın ne taşıdığını seçer (anahtarlar, yeni görüntü, eski görüntü ya da her ikisi), ardından öğe değişikliklerine yoklamadan tepki vermek için stream'i bir Lambda tetikleyicisiyle tüketirsiniz.
- Streams öğe düzeyindeki değişiklikleri yakalar — zaman sıralı, tekilleştirilmiş bir günlük olarak, 24 saate kadar saklanır.
- Her kaydın ne taşıdığını seçersiniz —
StreamViewTypearacılığıyla: yalnızca anahtarlar, yeni görüntü, eski görüntü ya da hem eski hem yeni. - Kayıtlar bir partition key içinde sıralıdır ve bir stream, tablonun bölümlendiği gibi parçalanır.
- Yerel tüketici Lambda'dır — yeni kayıtların her partisi için çalışan bir tetikleyici, daha zengin fan-out için Kinesis Data Streams alternatifiyle.
Sorun: yoklamadan tepki vermek
"Bir role.granted olayı yazıldığında bana uyarı ver" gerekir. Naif yaklaşım, her
dakika yeni olaylar için tarayan zamanlanmış bir iştir — ki bu her seferinde tüm yeni
partition'ı okur, kapasite harcar ve her zaman en az bir dakika geç kalır.
Aslında istediğiniz şey bir itmedir: DynamoDB bir öğe değiştiği anda size söyler. Streams tam olarak bunu sağlar, değişiklik kaydı sizin onu avlamanız yerine kodunuza teslim edilir.
Streams nasıl çalışır
AWS dokümanlarına göre, DynamoDB Streams "24 saate kadar değişikliklerin tekilleştirilmiş, zaman sıralı bir günlüğünü" yerel Lambda entegrasyonuyla saklar (DynamoDB için change data capture). Her kayıt bir öğe düzeyindeki değişikliği tanımlar.
Bir stream etkinleştirdiğinizde, her kaydın değişen öğenin ne kadarını taşıdığını
denetleyen bir StreamViewType seçersiniz:
| StreamViewType | her kayıt şunu içerir |
|---|---|
| KEYS_ONLY | yalnızca değişen öğenin anahtar öznitelikleri |
| NEW_IMAGE | değişiklikten sonraki haliyle tüm öğe |
| OLD_IMAGE | değişiklikten önceki haliyle tüm öğe |
| NEW_AND_OLD_IMAGES | hem öncesi hem sonrası görüntüleri |
Kayıtlar her partition key içinde sıralıdır ve stream, tabloyla aynı partition yapısı boyunca parçalanır. Saklama 24 saattir — Streams bir reaksiyon tamponudur, kalıcı bir geçmiş değil. Dayanıklı geçmiş için olayların kendisini saklarsınız (ki bu tam olarak denetim günlüğü tablomuzun zaten olduğu şeydir).
Yerel tüketici bir Lambda tetikleyicisidir: DynamoDB işlevinizi, geldikçe bir parti yeni stream kaydıyla çağırır.
Çalışılmış bir örnek: hassas denetim olaylarında uyarı
Denetim günlüğü tablosu NEW_IMAGE ile bir stream alır, böylece her kayıt tam yeni
olayı taşır. Bir Lambda partiyi tüketir ve yalnızca önemli kayıtları iletir:
| stream kaydı (NEW_IMAGE) | tüketici eylemi | ||
|---|---|---|---|
| TENANT#acme | EVENT#…#a2 | action=invoice.export | SIEM'e gönder |
| TENANT#globex EVENT#…#b9 action=role.granted | nöbetçiyi çağır | ||
| TENANT#acme | EVENT#…#a1 | action=login.success | yoksay |
İşlev tabloya hiç dokunmaz — yalnızca stream'in ona verdiğine tepki verir. Yoklama yok, tarama yok ve uyarı yazmadan saniyeler içinde tetiklenir. Kayıtlar partition key bazında sıralı olduğu için, bir kiracının tüm olayları yazıldıkları sırayla gelir.
Bu aynı zamanda bir alt-akış kopyası bakımının standart yoludur: bir stream tüketicisi her olayı tam metin denetim araması için OpenSearch'e yansıtabilir ya da sayıları toplayabilir — hepsi aynı değişiklik günlüğünden türetilir.
DynoTable'da yapın
Bir stream tüketicisi kurmadan önce, Lambda'nızın alacağı öğenin tam şeklini bilmeniz
gerekir — hangi öznitelikler var, iç içe map ve list'ler nasıl görünüyor, bir
NEW_IMAGE kaydı gerçekten ne içerecek.
Örnek bir öğeyi düz JSON ile bir stream kaydının kullandığı öznitelik-değer şekli
arasında dönüştürmek için DynamoDB JSON Dönüştürücüsü
bunu tarayıcınızda yapar. DynoTable'da ise tam öğeyi — DynamoDB-JSON biçimi dahil —
inceleyebilirsiniz; böylece NEW_IMAGE kaydını alan şeklini tahmin etmek yerine
gerçek veriye karşı modellersiniz.

Bir tüketiciyi yerel olarak test ediyorsanız, tabloyu DynamoDB Local'a karşı çalıştırıp aynı şekilde inceleyin — bkz. DynamoDB Local'a bağlanma.
Tuzaklar ve sonraki adımlar
- 24 saat bir birikim değildir. Tüketiciniz bir gün boyunca kapalıysa, kayıtlar süresi dolup gider. Streams kalıcı yeniden oynatma için değil, neredeyse gerçek zamanlı reaksiyon içindir — geçmiş için olayların kendisini saklayın.
- İhtiyacınız olan en küçük
StreamViewType'ı seçin.NEW_AND_OLD_IMAGESyükü iki katına çıkarır; öğeyi yeniden okumak için yalnızca anahtara ihtiyacınız varsa,KEYS_ONLYdaha ucuzdur. - Sıralama partition key bazındadır, global değil. İki farklı kiracının olayları arasında sıralama garantisi yoktur — yalnızca bir kiracının partition'ı içinde.
- TTL silmeleri stream kayıtları olarak görünür — sistem-özniteliği işaretçisiyle, ki bu süresi dolan öğeleri arşivlemenin yoludur — bkz. DynamoDB TTL.
Streams denetim günlüğünü bir olay kaynağına dönüştürür. Sonraki operasyonel endişe, bir öğenin ömrünün karşı ucu — eski olayların otomatik süresinin dolması: DynamoDB TTL.
Bir satır Lambda kodu yazmadan önce stream tüketicinizin alacağı tam öğe şeklini incelemek için DynoTable'ı indirin.


