Heute werden wir zwei Welten verbinden: Serverless Kafka und Serverless Functions.

Dieses Tutorial demonstriert, wie man Kafka-Nachrichten generiert, die AWS Lambda-Funktionen ausloesen. Die Kafka-Instanz wird auf Upstash laufen, und wir werden AWS fuer die Lambda-Funktionen verwenden.

Upstash ist eine On-Demand-Loesung mit nutzungsbasierter Abrechnung, die das Verwalten von Hardware, virtuellen Maschinen oder Docker-Containern vermeidet. Es kostet nichts, wenn es nicht benutzt wird - es skaliert buchstaeblich auf 0 herunter, was bedeutet, dass ueberhaupt keine Kosten entstehen.

Mehrere Schritte muessen abgeschlossen werden, bevor wir Nachrichten von unserem lokalen Rechner an Kafka auf Upstash senden koennen, die dann von AWS empfangen werden und unsere Lambda-Funktion ausloesen.

Wenn du lieber deine eigene Kafka-Instanz verwenden moechtest, passe die Schritte dieses Tutorials entsprechend an.

Die Schritte sind:

  • Einen Kafka-Cluster und ein Topic auf Upstash erstellen
  • Einen Producer und einen Consumer zum Testen des Clusters starten
  • Ein Secret erstellen
  • Eine Lambda-Funktion erstellen
  • Eine Lambda-Rolle erstellen
  • Einen Trigger erstellen
  • Das Setup testen

Es gibt viel zu tun, also lass uns loslegen.

Einen Kafka-Cluster und ein Topic auf Upstash erstellen

Falls du es noch nicht getan hast, erstelle ein Konto auf Upstash. Gehe dann zur Konsole und erstelle einen neuen Cluster.

Gib zuerst den Clusternamen und die Region an.

Als Naechstes erstelle das Topic, das unsere Nachrichten empfangen wird. Ich habe einfach einen Namen angegeben und die Standardwerte beibehalten.

Wenn du fertig bist, wird die Cluster-Uebersichtsseite angezeigt. Diese Seite bietet alle Informationen, die zum Verbinden mit dem Cluster erforderlich sind. Wir werden sie im naechsten Abschnitt benoetigen.

Jetzt, da unser Kafka-Cluster eingerichtet ist, werden wir ihn testen.

Einen Producer und einen Consumer zum Testen des Clusters starten

Kafka bietet Kommandozeilentools, die nuetzlich zum Abfragen und Testen eines Kafka-Clusters sind. Diese koennen lokal installiert oder ueber das offizielle Kafka-Docker-Image verwendet werden.

Wir werden die Befehle kafka-console-producer und kafka-console-consumer verwenden. Um es einfach zu halten, zeige ich sie so, als ob sie auf einem lokalen Rechner ausgefuehrt werden.

Hier ist ein Beispiel, wie man einen Consumer startet, wenn Kafka lokal installiert ist:

kafka-console-consumer.sh --topic planes --from-beginning --bootstrap-server kafka:9092

Das Gleiche, aber diesmal mit dem offiziellen Kafka-Docker-Image, sieht so aus:

docker-compose exec kafka bash -c 'kafka-console-consumer.sh --topic planes --from-beginning --bootstrap-server kafka:9092'

Fuer Upstash muessen wir etwas Konfiguration hinzufuegen, da wir uns authentifizieren muessen. Du willst ja nicht, dass jeder sich mit deinem Cluster verbinden kann, oder?

Erstelle in deinem lokalen Arbeitsverzeichnis eine Datei namens upstash.config und fuege die Properties von Upstash ein - fuer dein Konto.

sasl.mechanism=SCRAM-SHA-256
security.protocol=SASL_SSL
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username=\"YXBwYXJlbnQtYXNwLTExNjU2JMPd9pk9KbaNkvMiqW7h0l3FOHgPks2Ia3lgup4\" password=\"WcsQuBndTvo1zRYIHffSj5ZwN5A8G6sryjeG2k_1JyThzOzMDTURls2Fo-pboUX4hoza9g==\";"

Dann starte den Producer.

kafka-console-producer --bootstrap-server apparent-asp-11656-eu1-kafka.upstash.io:9092 --producer.config upstash.config --topic tutorial-topic

Starte in einer anderen Konsole den Consumer.

kafka-console-consumer --bootstrap-server apparent-asp-11656-eu1-kafka.upstash.io:9092 --consumer.config upstash.config --from-beginning --topic tutorial-topic

Sende schliesslich einige Nachrichten vom Producer und empfange sie im Consumer.

Gehe jetzt zu Amazon AWS, um die Teile zu erstellen und einzurichten, die noetig sind, um unsere Lambda-Funktion mit einer Kafka-Nachricht auszuloesen.

AWS Secret erstellen

Gehe zum AWS Secrets Manager und klicke auf “Store a new secret”.

Waehle “Other type of secret” und fuege die folgenden Key/Value-Paare fuer deinen Upstash-Benutzernamen und dein Passwort hinzu.

Klicke auf “Next”, gib einen Namen fuer das Secret an,

dann klicke auf “Next” und auf der “Store a new secret”-Seite klicke erneut auf “Next” und dann auf “Store”, ohne etwas zu aendern.

Damit erledigt, lass uns zur Erstellung unserer Lambda-Funktion uebergehen.

Lambda-Funktion erstellen

Klicke in AWS Lambda auf “Create function.”

Erstelle eine Node.js-Funktion namens “kafka-consumer.” Klicke auf “Create function”, wenn du bereit bist.

Ersetze den Inhalt von index.js durch

exports.handler = async (event) => {
 for (let key in event.records) {
  console.log('Key: ', key)
  event.records[key].map((record) => {
  console.log('Record: ', record)
  const msg = Buffer.from(record.value, 'base64').toString()
  console.log('Message:', msg)
  })
 }
}

Diese Funktion wird den Inhalt des Kafka-Events ausgeben, das sie ausgeloest hat.

Dann klicke auf “Deploy”.

Lambda-Rolle erstellen

Klicke auf “Configuration”, dann “Permissions” und waehle den Rollennamen, hier “kafka-consumer-role-eov2kffe”.

Die “Identity and Access Management (IAM)“-Konsole oeffnet sich.

Unter “Add permissions” waehle “Create inline policy”.

Im “JSON”-Tab fuege Folgendes hinzu:

{
 "Version": "2012-10-17",
 "Statement": [
  {
   "Effect": "Allow",
   "Action": [
    "secretsmanager:GetSecretValue"
   ],
   "Resource": "arn:aws:secretsmanager:eu-west-1:450055871228:secret:upstash-xcYDmy"
  }
 ]
}

Stelle sicher, dass du den Secret-ARN durch den fuer dein Secret ersetzt (du findest ihn auf der Secrets Manager-Uebersichtsseite).

Wenn du fertig bist, sollte die Policy so aussehen.

Klicke auf “Review policy”.

Unter “Review Policy” fuege einen Namen hinzu (zum Beispiel “SelfHostedKafkaPolicy”) und klicke auf “Create policy”.

Wenn erfolgreich, ist die Policy jetzt unter der IAM-Rollenseite aufgelistet.

Das war der kniffligste Teil des Tutorials. Gut gemacht, wenn du es bis hierher geschafft hast. Es gibt nur noch einen kleinen Schritt, bevor wir alles testen koennen.

Trigger erstellen

Klicke auf “Add Trigger” und waehle den “Apache Kafka”-Trigger.

Fuege den Endpunktnamen deines Kafka-Clusters unter “Bootstrap servers” und den Topic-Namen hinzu.

Unter “Authentication” klicke auf “Add” und gib das oben erstellte Secret an.

Dann klicke auf “Add”. Wenn alles erfolgreich ist, kehrst du zur Funktionsseite zurueck.

Wir sind fertig mit der Einrichtung. Ich hoffe, das hat bei dir funktioniert.

Es ist Zeit, alles zu testen.

Setup testen

Waehrend du noch in AWS bist, klicke auf “Monitor”.

Auf deinem lokalen Rechner starte den kafka-console-producer erneut, falls er nicht laeuft.

kafka-console-producer --bootstrap-server apparent-asp-11656-eu1-kafka.upstash.io:9092 --producer.config upstash.config --topic tutorial-topic

Dann sende eine oder mehrere Nachrichten.

Unter deinen AWS CloudWatch-Metriken solltest du Aufrufe der Lambda-Funktion sehen.

Klicke auf “View logs in CloudWatch”, um zur Logs-Seite zu gelangen.

Waehle den Log-Stream, um die Seite mit den Log-Inhalten zu oeffnen.

Da ist es! In der drittletzten Zeile ist die Nachricht, die ich gesendet habe, “Hello”. Je nachdem, was du gesendet hast, wirst du dort auch deine Nachricht finden.

Fazit

Was fuer eine Reise! Wir haben damit begonnen, Kafka-Nachrichten auf einem lokalen Rechner zu generieren, sie an eine Kafka-Instanz auf Upstash zu senden und sie schliesslich mit einer AWS Lambda-Funktion zu empfangen, um eine Aktion auszufuehren.

Ich hoffe, dir hat dieses Tutorial gefallen und du fandest es nuetzlich.

Danke fuers Lesen!

Ressourcen