İleri5 dakikalık okuma

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çersinizStreamViewType aracı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:

StreamViewTypeher kayıt şunu içerir
KEYS_ONLYyalnızca değişen öğenin anahtar öznitelikleri
NEW_IMAGEdeğişiklikten sonraki haliyle tüm öğe
OLD_IMAGEdeğişiklikten önceki haliyle tüm öğe
NEW_AND_OLD_IMAGEShem ö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.

LambdaStream"DynamoDB"AppLambdaStream"DynamoDB"App"Put EVENT role.granted""change record (NEW_IMAGE)""batch of records""if action is sensitive →alert"

Ç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#acmeEVENT#…#a2action=invoice.exportSIEM'e gönder
TENANT#globex EVENT#…#b9 action=role.grantednöbetçiyi çağır
TENANT#acmeEVENT#…#a1action=login.successyoksay

İş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.

Lambda tüketicisinin alacağı NEW_IMAGE stream kaydını modellemek için DynoTable'da bir denetim olayı öğesini inceleme.
Lambda tüketicisinin alacağı NEW_IMAGE stream kaydını modellemek için DynoTable'da bir denetim olayı öğesini inceleme.

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_IMAGES yükü iki katına çıkarır; öğeyi yeniden okumak için yalnızca anahtara ihtiyacınız varsa, KEYS_ONLY daha 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.

Güncellendi