İleri5 dakikalık okuma

DynamoDB Streams: Eksiksiz Rehber (Örneklerle)

DynamoDB Streams, bir değişiklik-verisi-yakalama günlüğüdür: bir tablodaki her ekleme, güncelleme ve silme, sırayla, tepki verebileceğin bir kayıt akışı olarak yakalanır. Bir tabloyu, onu yoklamadan bir olay kaynağına dönüştürmenin yoludur.

Denetim-günlüğü senaryosunda, hassas bir olay geldiği anda tepki vermek istersin — birisi bir faturayı dışa aktardığında ya da bir yönetici rolü verdiğinde bir uyarı ateşle — tabloyu bir zamanlayıcıyla taramadan. Streams, bunun push tarafıdır.

DynamoDB Streams nasıl çalışır?

DynamoDB Streams, bir tablodaki her ekleme, güncelleme ve silmeyi, 24 saate kadar saklanan, zaman-sıralı, tekilleştirilmiş bir kayıt günlüğü olarak yakalar. Her kaydın ne taşıyacağını StreamViewType ile seçer (anahtarlar, yeni image, eski image, ya da her ikisi), sonra item değişikliklerine yoklamadan tepki vermek için akışı bir Lambda tetikleyicisiyle tüketirsin.

  • Streams, item düzeyindeki değişiklikleri zaman-sıralı, tekilleştirilmiş bir günlük olarak yakalar, 24 saate kadar saklanır.
  • Her kaydın ne taşıyacağını StreamViewType ile seçersin: yalnızca anahtarlar, yeni image, eski image, ya da hem eski hem yeni.
  • Kayıtlar item başına sıralıdır — tek bir item'a yapılan değişiklikler, yazıldıkları sırada gelir — ve bir akış, ile aynı şekilde parçalanır.
  • Yerel tüketici Lambda'dır — her yeni kayıt topluluğu başına çalışan bir tetikleyici, daha zengin fan-out için alternatif olarak Kinesis Data Streams ile.

Sorun: yoklamadan tepki vermek

"Bir role.granted olayı yazıldığında beni uyar" istiyorsun. Naif yaklaşım, her dakika yeni olaylar için tarayan zamanlanmış bir iştir — bu, her seferinde tüm son partition'ı okur, kapasiteye mal olur ve her zaman en az bir dakika geç kalır.

Aslında istediğin bir push'tur: DynamoDB, bir item değiştiği anda sana söyler. Streams'in sağladığı tam olarak budur; değişiklik kaydı, onu avlaman yerine koduna teslim edilir.

Streams nasıl çalışır

AWS dokümanlarına göre, DynamoDB Streams, değişikliklerin tekilleştirilmiş, zaman-sıralı bir günlüğünü 24 saate kadar tutar, yerel Lambda entegrasyonuyla (DynamoDB için değişiklik verisi yakalama). Her kayıt, item düzeyinde bir değişikliği tanımlar.

Bir akışı etkinleştirdiğinde bir StreamViewType seçersin; bu, her kaydın değişen item'ın ne kadarını taşıyacağını kontrol eder:

StreamViewTypeeach record contains
KEYS_ONLYonly the key attributes of the changed item
NEW_IMAGEthe entire item as it looks after the change
OLD_IMAGEthe entire item as it looked before the change
NEW_AND_OLD_IMAGESboth the before and after images

Kayıtlar item başına sıralıdır — tek bir item'a yapılan değişiklikler yazıldıkları sırada görünür — ve akış, tablo ile aynı partition yapısı boyunca parçalanır. Saklama 24 saattir — Streams bir tepki tamponudur, kalıcı bir geçmiş değil. Dayanıklı geçmiş için olayların kendilerini saklarsın (ki denetim-günlüğü tablomuz zaten tam olarak budur).

Yerel tüketici bir Lambda tetikleyicisidir: DynamoDB, işlevini yeni akış kayıtlarından oluşan bir toplulukla, geldikçe çağırır.

Lambda"Akış""DynamoDB""Uygulama"Lambda"Akış""DynamoDB""Uygulama""Put EVENT role.granted""değişiklik kaydı (NEW_IMAGE)""kayıt topluluğu""action hassassa → uyar"

İşlenmiş bir örnek: hassas denetim olaylarında uyar

Denetim-günlüğü tablosu, NEW_IMAGE ile bir akış alır, böylece her kayıt tam yeni olayı taşır. Bir Lambda topluluğu tüketir ve yalnızca önemli olan kayıtları iletir:

stream record (NEW_IMAGE)consumer action
TENANT#acmeEVENT#…#a2action=invoice.exportsend to SIEM
TENANT#globex EVENT#…#b9 action=role.grantedpage on-call
TENANT#acmeEVENT#…#a1action=login.successignore

İşlev tabloya hiç dokunmaz — yalnızca akışın ona verdiğine tepki verir. Yoklama yok, tarama yok ve uyarı, yazmadan saniyeler içinde ateşlenir. Akış kayıtları item başına sıralıdır, bu yüzden aynı olay item'ına yapılan ardışık değişiklikler yazıldıkları sırada gelir.

Bu, aynı zamanda aşağı akış bir kopya sürdürmenin de standart yoludur: bir akış 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.

Bunu DynoTable'da yapın

Bir akış tüketicisini bağlamadan önce, Lambda'nın alacağı item'ın tam şeklini bilmen gerekir — hangi niteliklerin var olduğunu, iç içe map'lerin ve list'lerin nasıl göründüğünü, bir NEW_IMAGE kaydının gerçekte ne içereceğini.

Bir örnek item'ı düz JSON ile bir akış kaydının kullandığı nitelik-değer şekli arasında dönüştürmek için, DynamoDB JSON Dönüştürücü bunu tarayıcında yapar. Ve DynoTable'da, tam item'ı — DynamoDB-JSON biçimi dahil — inceleyebilirsin; böylece NEW_IMAGE kaydını, alan şeklini tahmin etmek yerine gerçek verilere karşı modellersin.

Lambda tüketicisinin alacağı NEW_IMAGE akış kaydını modellemek için DynoTable'da bir denetim olayı item'ını inceleme.
Lambda tüketicisinin alacağı NEW_IMAGE akış kaydını modellemek için DynoTable'da bir denetim olayı item'ını inceleme.

Bir tüketiciyi yerel olarak test ediyorsan, tabloyu DynamoDB Local'a karşı çalıştır ve onu aynı şekilde incele — bkz. DynamoDB Local'a bağlan.

Tuzaklar ve sonraki adımlar

  • 24 saat bir birikim listesi değildir. Tüketicin bir gün boyunca kapalıysa, kayıtlar yaşlanıp gider. Streams, dayanıklı yeniden oynatma için değil, gerçek-zamana-yakın tepki için vardır — geçmiş için olayların kendilerini sakla.
  • İhtiyacın olan en küçük StreamViewType'ı seç. NEW_AND_OLD_IMAGES, payload'ı ikiye katlar; item'ı yeniden okumaya gitmek için yalnızca anahtara ihtiyacın varsa, KEYS_ONLY daha ucuzdur.
  • Sıralama item başınadır, partition key başına ya da global değil. DynamoDB, sırayı yalnızca aynı item'a yapılan ardışık değişiklikler için garanti eder; farklı item'lar arasında, tek bir partition key içinde bile, hiçbir sıralama garantisi yoktur.
  • TTL silmeleri akış kayıtları olarak görünür — sistem-niteliği işaretçisiyle; süresi dolan item'ları böyle arşivlersin — bkz. DynamoDB TTL.

Streams, denetim günlüğünü bir olay kaynağına dönüştürür. Sonraki operasyonel kaygı, bir item'ın ömrünün karşı ucu — eski olayları DynamoDB TTL ile otomatik olarak süresini doldurmak.

Bir satır Lambda kodu yazmadan önce, akış tüketicinin alacağı tam item şeklini incelemek için DynoTable'ı indir.

Güncellendi