Eine Einfuehrung in Stations und Functions
Als mobiler Entwickler, der auch an Server-Backends und Cloud-Infrastruktur mit AWS arbeitet, wuensche ich mir immer einen einfachen, visuell ansprechenden Cloud-Service, mit dem ich schnell und einfach Datenpipelines erstellen kann.
Generell ziehe ich es vor, den Grossteil der Geschaeftslogik in einem Backend zu halten und die mobile App so einfach wie moeglich zu gestalten. Auf diese Weise kann ich bei Aenderungen der Geschaeftslogik Backend-Code neu bereitstellen, anstatt eine neue App-Version zu veroeffentlichen, was mehr Zeit in Anspruch nimmt.
Ich strukturiere Anwendungsfaelle auch gerne als Pipelines: Eine definierte Ein- und Ausgabe mit diskreten Schritten, die den Geschaeftsablauf ausmachen.
Waehrend AWS der dominierende Anbieter ist, finde ich ihre Web-UI oft kompliziert - besonders beim Prototyping und wenn man ohne das AWS SDK herumklicken moechte. Ich moechte etwas Einfaches und Exploratives. Ich habe moeglicherweise eine solche Loesung mit memphis.dev gefunden, die kuerzlich ihr “Functions”-Angebot veroeffentlicht haben. Mit Memphis erstellst du eine “Station” (aehnlich einem Kafka Topic) und kannst eine Datenpipeline visuell definieren. Stations haben Producer und Consumer.
Der wichtige Teil fuer mich ist die Moeglichkeit, Daten zu manipulieren, bevor Consumer Nachrichten erhalten. Memphis bietet mehrere nuetzliche eingebaute Funktionen, die du anpassen kannst. Alternativ kannst du deine eigenen Funktionen in einem GitHub-Repository definieren, das du kontrollierst, und es mit deinem Memphis-Konto verknuepfen.
Stell dir ein fiktives Szenario vor: Eine Person kommt zur Behandlung in ein Krankenhaus und registriert sich. Sie gibt persoenliche Daten an, die im gesamten Krankenhaus verwendet werden.
Einige Daten sind fuer bestimmte Abteilungen relevant und fuer andere irrelevant. Zum Beispiel benoetigt das Kuechenpersonal keine Sozialversicherungsnummern der Patienten, und die Abrechnung benoetigt keine Ernaehrungspraeferenzen. Ueber die Irrelevanz hinaus kann die DSGVO einigen Abteilungen rechtlich verbieten, bestimmte persoenliche Daten zu verarbeiten oder zu speichern. Daher ist das Bereinigen oder Einschraenken von Daten notwendig.
Wir werden auch das Anreichern eingehender Daten mit Feldern behandeln, die nicht von Producern bereitgestellt werden. Wenn einer mobilen App beispielsweise eine erforderliche Funktion fehlt, kannst du der Pipeline eine Funktion hinzufuegen, anstatt die App neu zu veroeffentlichen.
In diesem Beitrag werde ich eine Pipeline erstellen, die eingehende Daten mit einem Zeitstempel anreichert und ein anderes Datenfeld vor dem Konsum entfernt. Ich werde:
- Einen Client-Benutzer erstellen
- Eine Station erstellen
- Einen JSON Web Token erstellen
- Eine Nachricht produzieren
- Eine Nachricht konsumieren
- Eine Funktion zum Hinzufuegen eines Zeitstempels anhaengen
- Eine Funktion zum Entfernen eines Datenfelds anhaengen
Dies definiert eine einfache Pipeline: Eine Eingabenachricht von einem Producer wird von der Station verarbeitet und an abonnierte Consumer verteilt.
In einem zweiten Beitrag werden wir private Funktionen vorstellen, die in deinem GitHub-Repository gehostet werden, und Schema-Konsistenz ueber Dienste hinweg sicherstellen.
Nach dem Erstellen eines Kontos beginnen wir mit einer leeren Uebersicht.

Client-Benutzer erstellen
Erstelle einen Client-Benutzer: Klicke auf “Users → Client → Add a new user”. Notiere dir das Passwort; du wirst es spaeter benoetigen.

Station erstellen
Als Naechstes erstelle die Station. Weitere Informationen zu Stations findest du in der Memphis Station Documentation. Wenn du Kafka-Erfahrung hast, wird dir das Konzept vertraut sein.
Klicke auf “Stations → Create a new station”. Gib einen Namen ein und lasse die anderen Felder unveraendert.

Jetzt kannst du die Pipeline sehen: Eingabe links, die Station in der Mitte und Ausgabe rechts. Die Station wird unsere Funktionen hosten; mehr dazu spaeter.

JSON Web Token erstellen
Um Nachrichten zu produzieren und zu konsumieren, benoetigen wir einen JSON Web Token (JWT) zur Authentifizierung.
Ein UI-Hinweis: Der “Code generator” oben rechts ist sehr nuetzlich; ich wuerde ihn mir an einer prominenteren Stelle wuenschen, aber das ist persoenliche Praeferenz.
Erstelle einige REST-Aufrufe mit dem Code-Generator. Du benoetigst nur einen Benutzer und ein Passwort. Klicke auf “Generate JWT token” und kopiere dann sowohl den Token als auch den Refresh-Token an einen sicheren Ort.

Um den curl-Befehl zu verwenden, fuege ihn in dein Terminal ein und fuehre ihn aus.
% curl --location --request POST 'https://aws-eu-central-1.restgw.cloud.memphis.dev/auth/authenticate' \
--header 'Content-Type: application/json' \
--data-raw '{
"username": "clientuser",
"password": "bBT$089SC1",
"account_id": 223672184,
"token_expiry_in_minutes": 100,
"refresh_token_expiry_in_minutes": 100
}'
{"expires_in":102148303560000,"jwt":"...","jwt_refresh_token":"...","refresh_token_expires_in":102148303560000}%Nachricht produzieren
Generiere nun die erste Nachricht. Oeffne den Code-Generator und wechsle zum Tab “Produce data”.

Kopiere den generierten Befehl in dein Terminal und fuehre ihn aus.
% curl --location --request POST 'https://aws-eu-central-1.restgw.cloud.memphis.dev/stations/my-first-station/produce/single' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9....' \
--header 'Content-Type: application/json' \
--header 'mykey: my value' \
--data-raw '{"message": "New Message"}'
{"error":null,"success":true}%Du kannst nun die empfangene Nachricht in der Station sehen und ihre Details inspizieren.

Nachricht konsumieren
Um die Nachricht zu konsumieren, oeffne den Code-Generator, kopiere den Consume-Befehl und fuehre ihn aus.

Du erhaeltst die zuvor generierte Nachricht; sie bleibt an diesem Punkt unveraendert.
% curl --location --request POST 'https://aws-eu-central-1.restgw.cloud.memphis.dev/stations/my-first-station/consume/batch' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9....' \
--header 'Content-Type: application/json' \
--data-raw '{
"consumer_name": "myconsumer",
"consumer_group": "mygroup",
"batch_size": 10,
"batch_max_wait_time_ms": 1000
}'
[{"message":"{\"message\": \"New Message\"}","headers":{...}}]%Zeitstempel-Funktion hinzufuegen
Jetzt der spassige Teil: Geschaeftslogik zur Transformation von Nachrichten hinzufuegen.
Klicke in deiner Station auf “Functions → Add function”.

Installiere die “add-timestamp”-Funktion.

Teste nach der Installation die Funktion und haenge sie an deine Station an.

Jede jetzt produzierte Nachricht wird ein zusaetzliches Zeitstempelfeld haben. Hier produziere ich eine Nachricht ueber die Web-UI, um diese Option zu demonstrieren.

Jetzt enthaelt die empfangene Nachricht einen Zeitstempel, wenn sie in der Station angezeigt wird.

Daten-Entfernungsfunktion
Als Naechstes fuege eine Funktion zum Bereinigen von Daten hinzu. Wie bereits erwaehnt, ist das Bereinigen persoenlicher Informationen oft durch die DSGVO erforderlich. In Deutschland sind die Vorschriften zu personenbezogenen Daten (PII) besonders streng, daher ist es wichtig, Anwendungen von Anfang an DSGVO-konform zu gestalten. Ein einfacher Datenbereinigungs-Mechanismus bietet Flexibilitaet und spart Zeit und Kosten.
Memphis-Funktionen koennen auch zur Pseudonymisierung verwendet werden: Bestimmte Daten werden durch einen Schluessel ersetzt und der Schluessel separat gespeichert. Leser des urspruenglichen Datensatzes sehen nur den Schluessel, nicht die PII. Du koenntest eine Funktion implementieren, die Inhalte durch einen generierten Schluessel ersetzt.
In diesem Tutorial verwenden wir die fertige Bereinigungs-Funktion. Moeglicherweise erkunde ich private Funktionen spaeter, um Pseudonymisierung zu demonstrieren.

Klicke unter “Function” auf den ”+“-Button, um eine neue Funktion hinzuzufuegen, die nach “add-timestamp” ausgefuehrt wird.
Um die “remove-fields”-Funktion zu installieren und anzuhaengen, fuege einen Parameter hinzu, der den zu entfernenden Feldnamen angibt. In dieser Demo entfernen wir das “hobby”-Feld (die Code-Generator-Vorlage enthaelt es).

Jetzt kannst du die zweite Funktion in der Station sehen.

Teste erneut, indem du eine neue Nachricht produzierst.

Bestaetige, dass:
- der Zeitstempel erhalten bleibt
- das hobby-Feld entfernt wurde
Sieht gut aus!

Fazit
Dies war ein Crashkurs zum Datenpipelining mit Memphis Functions. Das Feature bietet bereits greifbare Vorteile fuer Entwickler und ermoeglicht groessere Effizienz und potenzielle Kosteneinsparungen. Es gibt ein paar UI-Probleme, aber ich erwarte, dass das Memphis-Team diese angehen wird.
Das Kernangebot scheint zuverlaessig und weitere Erkundung wert. Du kannst private Funktionen verwenden, die in deinem GitHub-Repository gehostet werden, um lokal zu iterieren und Updates zu pushen, um deine Pipeline zu modifizieren.
In Teil 2 werden wir ein GitHub-Repository fuer private Funktionen erstellen, es mit Memphis verknuepfen, eine benutzerdefinierte Funktion implementieren und sie live schalten. Wir werden auch Memphis’ “Schemaverse” zur Sicherstellung von Schema-Konsistenz ueber Dienste hinweg erkunden.