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, benötigen die entsprechenden Prozessoren:
-
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
. Um diesen zu Nutzen müssen
sie den Entsprechenden Service in ihrer Prozessgruppe erstellen,
aktivieren, und ihre AWS Authentifizierungsdaten eintragen.
Alternativ können sie die Authentifizierungsdaten auch direkt in den einzelnen Prozessoren angeben.
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 mittles 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 Email des Users
und als Range key den string info
. Hier sehen sie wie man ein
entsprechendes FlowFile mittels eines GenerateFlowFile
Prozessors
generiert werden kann.
Nun müssen wir noch den PutDynamoDB
Prozessor konfigurieren. Dafür
müssen wir zusätzlich zu den bereits bekannten Eigenschafften 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:
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).
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 |
---|---|---|
info |
|
GetDynamoDB
Der GetDynamoDB
Prozessor funktioniert analog zum PutDynamoDB
Prozessor. Eine Konfiguration könnte wie folgt aussehen.
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 entsprechend wie beim 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 können 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 alsoUser
. -
Sort Key Field
ist der Name des Range Keys der Tabelle. in unserem Fall alsoRange
.
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 den selben 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 email max.muster@mustermail.com
.
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: