DynamoDB Tutorial

Einführung

In diesem Artikel wird beschrieben, wie man mit folgenden Prozessoren eine Verbindung zu einer AWS DynamoDB Datenbank herstellen kann.

  • PutDynamoDB (bzw. PutDynamoDBRecord) um Daten in eine Tabelle einzutragen.

  • GetDynamoDB um Daten aus einer Tabelle abzurufen.

  • DeleteDynamoDB um Daten aus einer Tabelle zu löschen.

Voraussetzungen

Um die DynamoDB Prozessoren nutzen zu können braucht man allem voran eine bereits bestehende AWS DynamoDB Tabelle. Um eine Verbindung zu dieser herzustellen, müssen folgende Voraussetzungen gegeben oder bekannt sein:

  • den Namen/ die Adresse der DynamoDB Tabelle die angesteuert werden soll.

  • eine Form der Authentifizierung für AWS

  • Den Namen der Hash und Range Keys der Tabelle.

Authentifizierung

Für die Authentifizierung empfehlen wir die Nutzung des Services AWSCredentialsProviderControllerService.

Alternativ können die Authentifizierungsdaten auch direkt in den einzelnen Prozessoren angeben werden.

Auch wenn die Authentifizierung für die Prozessoren über den AWSCredentialsProviderControllerService läuft, muss in den Prozessoren immer der richtige Wert für die Property "Region" gegeben sein.

Grundlegende Put und Get Operationen

In diesem Absatz wird die grundlegende Funktionsweise der PutDynamoDB- und GetDynamoDB-Prozessoren erklärt. Dafür betrachten wir folgendes kleines Beispiel.

DynamoDB ist eine NoSQL Datenbank. Daten werden hier mittels eines Primären (Hash Key) und eines sekundären (Range Key) Schlüssels gespeichert.

Gegeben ist eine DynamoDB-Tabelle, in der Informationen über Nutzer gespeichert werden sollen. Die Tabelle hat einen Hash Key und einen Range Key:

  • Hash key: User

  • Range Key: Range

Nun möchten wir mittels des PutDynamoDB-Prozessors grundlegende Informationen über unsere Nutzer in die Tabelle eintragen. In diesem Beispiel nehmen wir an, dass die Informationen in Form eines JSON Objekts gegeben sind:

{
"name" : "Max",
"surname" : "Mustermann",
"email" : "max.muster@mustermail.com",
"phone": "+49 (0)123 456789"
}

Um diese Daten nun in der DynamoDB Tabelle zu speichern, setzen wir dieses Objekt als Content eines FlowFiles. Zusätzlich benötigt das FlowFile folgende attribute für Hash und Range Key:

  • dynamodb.item.hash.key.value

  • dynamodb.item.range.key.value

In diesem Beispiel verwenden wir für den Hash Key die E-Mail des Users und als Range key den string info. Hier sehen sie wie man ein entsprechendes FlowFile mittels eines GenerateFlowFile Prozessors generiert werden kann.

Generate Mockup Data

Nun müssen wir noch den PutDynamoDB Prozessor konfigurieren. Dafür müssen wir zusätzlich zu den bereits bekannten Eigenschaften außerdem den Namen des Attributs angeben, unter dem die eingehenden Daten gespeichert werden sollen. Dies geschieht mittels der Property Json Document Attribute. In diesem Beispiel nennen wir dieses Attribut einfach data.

Sowohl PutDynamoDB als auch GetDynamoDB können nur ein einzelnes Attribut der Daten für gegebene Hash-/Range Keys lesen bzw. schreiben. In einem späteren Absatz wird erklärt, wie mittels PutDynamoDBRecord mehrere Attribute, sowie auch mehrere Range Keys geschrieben werden können. Eine analoge Funktionalität existiert im Moment nicht für GetDynamoDB.

PutDynamoDB

Eine Konfiguration für einen PutDynamoDB Prozessor könnte dann so aussehen:

PutDynamoDB config

Verwendet man nun diese Konfiguration wie folgt in einem Flow zusammen mit dem zuvor generierten FlowFile, werden die Daten in der Tabelle eingefügt (bzw. geändert, wenn sie bereits existieren).

Flow

Bei einem erfolgreichen ausführen wird das FlowFile ohne Änderung an die Success Relation weitergeleitet.

Nach dem Ausführen könnte die Tabelle wie folgt aussehen:

User Range data

max.muster@mustermail.com

info

{ "name" : "Max", "surname" : "Mustermann", "email" : "max.muster@mustermail.com","phone": "+49 (0)123 456789"}

GetDynamoDB

Der GetDynamoDB-Prozessor funktioniert analog zum PutDynamoDB-Prozessor. Eine Konfiguration könnte wie folgt aussehen.

GetDynamoDB

Wie zuvor werden Hash Key, Range Key und Attribut aus den (FlowFile-) Attributen eines eingehenden FlowFiles gelesen. Sind die entsprechenden Daten in der Tabelle vorhanden, werden diese als Content in das FlowFile eingetragen und dieses and die Success Relation geleitet. Falls die Daten nicht in der Tabelle zu finden sind, wird das FlowFile stattdessen an die not found Relation weitergeleitet.

Die Property Range Key Value ist für die Prozessoren GetDynamoDB und DeleteDynamoDB nicht als Pflichtangabe gekennzeichnet. Wenn eine DynamoDB Tabelle mit Hash und Range Key erstellt ist müssen diese Prozessoren aber auch immer inclusive Range Key aufgerufen werden. Das Abrufen oder löschen aller Daten nur basierend auf dem Hash Key ist nur für Tabellen ohne Range Key möglich. Bei einer Tabelle ohne Range Key werden die entsprechenden Attribute und Properties ignoriert.

Daten aus der Datenbank löschen

Um Daten aus der Tabelle zu löschen, benutzt man den DeleteDynamoDB-Prozessor. Wie zuvor geben hier die Attribute eines eingehenden FlowFiles den Hash- und Range Key der zu löschenden Daten an. Hierbei werden alle Attribute der entsprechenden Daten gelöscht.

Die Konfiguration ist dabei analog zum GetDynamoDB-Prozessor.

Spezialfall PutDynamoDBRecord

Der PutDynamoDBRecord Prozessor erlaubt es mehrere Daten (im Record Format) auf einmal in die Datenbank zu schreiben. Dabei können Daten sowohl mit unterschiedlichen Range Keys als auch mit unterschiedlichen Attributen gleichzeitig geschrieben werden.

Die Daten müssen dafür in einem Format gegeben sein, das von einem Record Reader eingelesen werden kann, und müssen je nach Anwendung im richtigen Format gegeben sein.

Da Properties dieses Prozessors unterscheiden sich deutlich von den Konventionen der vorher erklärten Prozessoren, hierbei gilt.

  • Partition Key Field ist der Name des Hash Keys der Tabelle. In unserem Fall also User.

  • Sort Key Field ist der Name des Range Keys der Tabelle. In unserem Fall also Range.

Für beide Keys ist es möglich, diese dynamisch und mit unterschiedlichen Strategien zu bestimmen.

  • Der Hash Key kann entweder wie gehabt als FlowFile Attribut gegeben sein, als Feld aus dem eingehenden Record gelesen werden oder dynamisch aus einer UUID erzeugt werden.

  • Der Range Key kann entweder weggelassen werden (nur möglich bei Tabellen ohne Range Key), aus einem Feld im eingehenden Record gelesen werden oder mittels eines Counters erstellt werden.

Beispiel

Wir verwenden wie zuvor eine Tabelle mit:

  • Hash Key: User

  • Range Key: Range

In diesem Beispiel wollen wir für unseren Nutzer neben grundlegenden Informationen auch Zahlungsinformationen speichern. Wir haben also nicht nur ein, sondern 2 JSON Objekte, die wir speichern wollen. Damit wir diese mit dem PutDynamoDBRecord-Prozessor verwenden können müssen wir sie in das richtige Format bringen:

[
{
"Range" : "info",
"data" : {
    "name" : "Max",
    "surname" : "Mustermann",
    "email" : "max.muster@mustermail.com",
    "phone": "+49 (0)123 456789"
    }
},
{
"Range" : "payment",
"paymentMethod" : "credit card",
"data" : {
    "paymentMethod": "credit card",
    "lastFourDigits": "5678",
    "expirationDate": "12/28",
    "billingZip": "54321"
    }
}
]

Dies ist eine Liste mit 2 Records, die beide in die Tabelle eingetragen werden sollen. Da beide Records denselben Hash Key haben, werden wir diesen mittels eines Attributes im FlowFile angegeben. Dafür verwenden wir wieder das Attribut dynamodb.item.hash.key.value und setzten den Wert auf die E-Mmail max.muster@mustermail.com.

FlowFile

Der Range Key wird hier durch die Felder Range in den Records angegeben und jedes weitere Record-Field wird als Attribut verwendet. (Der Name dieses Feldes muss dem Namen der Sort Key Field Property entsprechen)

In diesem Beispiel heißt das: Der erste Record in der Liste wird in der Datenbank mit dem Hash Key max.muster@mustermail.com und Range Key info eingetragen und ein Attribut mit dem Namen data haben.

Für den Zweiten Record mit dem Range Key payment wird zusätzlich zu dem data Attribut außerdem das Attribut paymentMethod eingetragen.

Die entsprechende Konfiguration für den PutDynamoDBRecord-Prozessor:

PutDynamoDBRecord