Amazon EventBridge bietet Entwicklern die Möglichkeit, Anwendungen mithilfe eines serverlosen Event Bus zu entkoppeln und Nachrichten basierend auf verschiedenen Anforderungen an unterschiedliche Empfänger weiterzuleiten.
Den Kern von EventBridge stellen hierbei sowohl der sog. Event Bus als auch verschiedene Verarbeitungsregeln (Rules) dar, über die gesteuert wird, welchem Empfänger (Target) eine Nachricht zugewiesen wird. Ein einzelner Event Bus kann dabei bis zu 300 Rules enthalten. Eine Rule wiederum kann bis zu 5 Targets besitzen, an die die Nachricht gesendet wird. Die unterschiedlichsten AWS Services oder SaaS-Anwendungen können Nachrichten auf einem zugehörigen Event Bus zur Weiterverarbeitung hinterlegen.
Der Default Event Bus wird in der AWS-Managementkonsole wie folgt dargestellt:
Nutzt man nun EventBridge mit einem Custom Event Bus bzw. dem Default Event Bus könnte ein theoretischer Aufbau folgendermaßen aussehen:
In obigem Beispiel wurden dem Default Event Bus zwei Rules zugeordnet:
Rules werden dabei durch JSON-Objects repräsentiert, welche einkommende Events auf die benötigten Attribute hin überprüfen. Beispielsweise könnte eine einfache Rule den folgenden Inhalt besitzen:
{
"source": ["myapp"],
"detail-type": ["logs"]
}
Alle einkommenden Events, die als Quelle (source
) den Inhalt myapp
besitzen und im detail-type
den Wert logs
hinterlegt haben, werden an die mit der Rule verknüpften Empfänger gesendet. Diese Regeln können hierbei beliebig komplex werden und u.a. numerische Vergleiche, Verknüpfungen (and/or) oder das matching von prefixen enthalten.
Ein Überblick über alle Filtermöglichkeiten findet sich in der EventBridge Dokumentation:
Sollte eine Nachricht nicht zugewiesen werden können, versucht EventBridge diese (standardmäßig) 24 Stunden lang dem entsprechenden Empfänger zu übergeben. Diese sog. Retry-Policy kann aber auch basierend auf den Nutzeranforderungen angepasst werden, sodass eine garantierte Zustellung sichergestellt wird.
Darüber hinaus bietet EventBridge Entwicklern die Möglichkeit, einkommende Nachrichten vorzuverarbeiten, bevor diese an ihren entsprechenden Empfänger geleitet werden. Dies kann über den sog. Input Transformer erreicht werden, bei dem der Inhalt der Nachricht definiert wird, der an das zugehörige Target gesendet wird, sollte die zugehörige Rule zutreffen. So können bspw. überflüssige oder nicht relevante Informationen aus der Nachricht vor der eigentlichen Verarbeitung gelöscht werden.
In folgender Anwendung wird Amazon EventBridge als intermediärer Dienst zwischen API und den zugehörigen Backend-Diensten genutzt. Eingehende Anfragen kommen auf dem Event Bus in EventBridge an und werden entsprechend der vorliegenden Rules an die zugehörigen Targets weitergeleitet. Wie im eingehenden Beispiel sind auf dem Event Bus zwei Rules hinterlegt, welche passende Nachrichten jeweils an eine Lambda-Funktion zur Verarbeitung bzw. an CloudWatch Logs zur Ausgabe/Analyse weiterleiten. Events, auf die keine Rule zutrifft, werden automatisch verworfen.
Für die Umsetzung und Nutzung von Amazon Eventbridge existieren zahlreiche Tutorials im Internet. Alternativ dazu kann aber auch auf IaC-Lösungen wie CloudFormation oder auf das CDK von AWS zurückgegriffen werden. Allgemein betrachtet, werden die folgenden Ressourcen benötigt:
{
"source": ["http-api"],
"detail-type": ["invoke-lambda"]
}
Die erste Rule leitet Nachrichten an die zugehörige Lambda-Funktion zur Verarbeitung weiter.
{
"source": ["http-api"],
"detail-type": ["log-message"]
}
Die zweite Rule sendet Nachrichten an eine CloudWatch Log Group zur Ausgabe.
Im Folgenden werden via Postman zwei Anfragen an den mit EventBridge verknüpften Endpunkt gesendet.
Anfrage 1:
{
"Source": "http-api",
"DetailType": "invoke-lambda",
"Detail": {
"message": "Hello, world!"
}
}
Anfrage 2:
{
"Source": "http-api",
"DetailType": "log-message",
"Detail": {
"message": "Hello, world!"
}
}
Die erste Anfrage wird entsprechend der zugehörigen Rule nur an die verknüpfte Lambda-Funktion gesendet. Hierbei wurde außerdem ein einfacher Input Transformer definiert, welcher die Nachricht auf eine Teilmenge reduziert. Folgende Ausgabe kann dabei beobachtet werden:
{
source: 'http-api',
'detail-type': 'invoke-lambda',
detail: { message: 'Hello, world!' }
}
Bei der zweiten Anfrage wurde eine CloudWatch Log Group als Target definiert, um eine einfache Ausgabe der über die API gesendeten Anfrage zu ermöglichen:
{
"version": "0",
"id": "de4642d4-2ff5-8e38-db82-261ed10c8512",
"detail-type": "log-message",
"source": "http-api",
"account": "XXX",
"time": "2022-07-07T10:16:31Z",
"region": "eu-central-1",
"resources": [],
"detail": { "message": "Hello, world!" }
}
Vergleicht man beide Ausgaben, fällt auf, dass sich der Inhalt beider unterscheidet. Dies liegt an dem zuvor erwähnten Input Transformer, welcher für die Rule der Lambda-Funktion definiert worden ist.
EventBridge ermöglicht die detaillierte Steuerung der Zustellung von Nachrichten an verschiedene Empfänger einer Applikation.
Hierbei werden Events basierend auf zuvor erstellten Rules überprüft und an die entsprechenden Ziele gesandt. Nachrichten können dabei beliebig granular gefiltert und vor der Zustellung über Input Transformer eine entsprechende Anpassung erhalten, sodass nur notwendige Informationen das zugehörige Target erreichen.
Sollte eine Nachrichtenübergabe nicht erfolgreich sein, kann über die Retry Policy die Anzahl der wiederholten Zustellungen definiert werden. Somit kann der Informationsfluss innerhalb einer Anwendung garantiert, kontrolliert und sichergestellt werden, sodass jede Komponente nur die für sie notwendigen Nachrichten erhält.
Sollten Sie weitere Fragen zu Amazon EventBridge oder zum Entwickeln verteilter Anwendungen haben, stehe ich für Anfragen jederzeit gerne zur Verfügung. Ebenfalls ist Feedback aller Art zu diesem Blog-Post gerne gesehen.