Erreichen

Grow

Manage

Automate

Erreichen

Grow

Manage

Automate

Erstellen und Verwenden von Bird Webhooks

Vogel

27.01.2022

E-Mail

1 min read

Erstellen und Verwenden von Bird Webhooks

Vogel

27.01.2022

E-Mail

1 min read

Erstellen und Verwenden von Bird Webhooks

Die folgende einfache Anleitung soll Absendern helfen, sich wohl zu fühlen, wenn sie ein Bird-Events-WebHook erstellen und die Daten mit der Infrastruktur von AWS konsumieren.

Bird’s Echtzeit-Event-Webhooks sind ein unglaublich wertvolles Werkzeug für Absender, um Daten automatisch in ihre Systeme übertragen zu lassen. Dies kann nachgelagerte Automatisierungsvorgänge wie das Aktualisieren von Mailinglisten, das Auslösen automatisierter E-Mail-Reisen oder das Befüllen interner Dashboards ermöglichen. Während dieselben Ereignisdaten über das Bird UI mithilfe von Event Search oder programmatisch durch die Nutzung der Bird Events API abgerufen werden können, können Beschränkungen hinsichtlich der Anzahl von Datensätzen, die in einer einzigen Anfrage zurückgegeben werden, oder Geschwindigkeitsbegrenzungen, die für den API-Endpunkt gelten, beide Methoden für große und anspruchsvolle Absender einschränkend machen.  

Echtzeit-Event-Webhooks ermöglichen es einem Absender, einen Endpunkt zu konfigurieren, an den Bird die Daten überträgt, und die Daten können konsumiert werden, ohne dass Cron-Jobs geplant werden müssen, die die Daten abrufen. Es gibt auch logistische Kompromisse, wenn Sie die Daten abrufen, anstatt sie an Sie senden zu lassen, wie z. B. die Notwendigkeit festzulegen, welchen Zeitraum und welche Parameter für jede API-Anfrage verwendet werden sollen. Wenn die Zeiträume nicht perfekt übereinstimmen, riskieren Sie, Daten zu verpassen, und wenn die Zeiträume sich überschneiden, müssen Sie doppelte Datensätze handhaben. Mit Echtzeit-Webhooks werden Ereignisdaten einfach an Ihren Endpunkt gesendet, sobald sie innerhalb von Bird verfügbar werden.

Während die Vorteile des Empfangs von Ereignisdaten in Echtzeit zur Steuerung nachgelagerter Automatisierungsprozesse von vielen Absendern sofort verstanden werden, kann der eigentliche Prozess der Implementierung und Nutzung von Webhooks einschüchternd wirken. Dies kann besonders dann zutreffen, wenn Sie mit den technischen Komponenten der Erstellung eines Endpunkts und der programmatischen Verarbeitung der Daten nicht vertraut sind. Es gibt Dienste, die Bird-Webhook-Daten konsumieren und automatisch in Ihre Datenbank ETL durchführen – ein Beispiel wäre StitchData, über das wir in der Vergangenheit gebloggt haben.  Wenn Sie jedoch mehr Kontrolle über den Prozess wünschen, können Sie die Komponenten problemlos selbst erstellen. Das Folgende ist ein einfacher Leitfaden, damit sich Absender wohlfühlen, wenn sie einen Bird-Events-Webhook erstellen und die Daten mit der Infrastruktur innerhalb von AWS konsumieren.

Konfigurieren des Webhook Target Endpoint

Wenn ein Bird-Ereignis erstellt wird, möchten wir, dass die Ereignisdaten in Echtzeit an einen Endpunkt in AWS gestreamt werden, damit wir die Daten programmatisch konsumieren und nutzen können. Die Daten werden von Bird an einen Zielendpunkt gesendet, der die Nutzlast an eine Lambda-Funktion weiterleitet, die die Daten verarbeitet und in einem S3-Bucket speichert. Ein schematisches Diagramm des beschriebenen Datenflusses ist unten zu sehen:


Flowchart for a system with components, showing a process starting with 'MessageBird', continuing through an 'Application Load Balancer', leading to a 'Lambda Script (Consumer)', connecting to an 'S3' storage, and optionally processed by another 'Lambda Script (Process)'.


Um diesen Workflow zu implementieren, bauen wir ihn tatsächlich in umgekehrter Reihenfolge auf, beginnend mit der Erstellung eines S3-Buckets, in dem wir unsere Ereignisdaten speichern, und arbeiten dann rückwärts – indem wir jede Komponente hinzufügen, die zu dem beiträgt, was wir bereits gebaut haben.

Erstellen Sie einen S3-Bucket zum Speichern der Webhook-Daten

Bevor wir unseren Load Balancer erstellen, um die Daten zu akzeptieren, oder unsere Lambda-Funktion, um die Daten zu speichern, müssen wir zuerst unseren S3-Bucket erstellen, in dem die Daten gespeichert werden. Während S3 exzellenten Speicher für Webhook-Daten bietet, sollten Organisationen, die auch PostgreSQL-Datenbanken für die Ereignisverarbeitung verwenden, ordnungsgemäße Backup- und Wiederherstellungsverfahren implementieren, um ihre strukturierten Daten neben ihrer S3-Speicherstrategie zu schützen. Dazu navigieren Sie zum S3-Dienst innerhalb von AWS und drücken „Bucket erstellen“. Sie werden aufgefordert, Ihrem Bucket einen Namen zu geben und die Region festzulegen – stellen Sie sicher, dass Sie dieselbe Region wie Ihr ALB und die Lambda-Funktion verwenden. Wenn Ihr S3-Bucket erstellt wird, ist er leer – wenn Sie die Daten in einem Ordner organisieren möchten, können Sie entweder das beabsichtigte Verzeichnis jetzt erstellen oder das Verzeichnis wird erstellt, wenn Ihre Lambda-Funktion die Datei speichert. In diesem Beispiel haben wir unseren S3-Bucket „bird-webhooks“ genannt und einen Ordner namens „B Event Data“ erstellt, um unsere Ereignisdaten zu speichern – diese Namen werden in unserer Lambda-Funktion unten erwähnt.

Erstellen Sie eine Lambda-Funktion, um die Daten zu konsumieren

Die eigentliche Verarbeitung und Speicherung der Daten wird von einer Lambda-Funktion durchgeführt, die von unserem Application Load Balancer (ALB) aufgerufen wird. 

Der erste Schritt besteht darin, Ihre Lambda-Funktion zu erstellen, indem Sie zum Lambda-Dienst innerhalb von AWS navigieren und auf „Funktion erstellen“ klicken. Sie werden aufgefordert, Ihrer Lambda-Funktion einen Namen zuzuweisen und auszuwählen, welche Programmiersprache Sie für Ihre Funktion verwenden möchten. Für dieses Beispiel verwenden wir Python als Laufzeitumgebung.

Jetzt müssen wir unsere Lambda-Funktion entwickeln. Nehmen wir einen Moment an, dass unser Application Load Balancer konfiguriert wurde und die Webhook-Nutzlast an unsere Lambda-Funktion weiterleitet – die Lambda erhält eine Nutzlast, die die vollständigen Header und den Body enthält. Die Nutzlast wird als Wörterbuch im Objekt „event“ an unsere Lambda-Funktion übergeben. Sie können unabhängig auf die Header und den Body der Nutzlast zugreifen, indem Sie auf die Objekte „headers“ und „body“ innerhalb der Nutzlast zugreifen. In diesem Beispiel werden wir einfach den „x-messagesystems-batch-id“-Header lesen, bei dem die Batch-ID ein eindeutiger Wert ist, der von Bird für den Webhook-Batch erstellt wurde und den wir als Dateinamen verwenden, wenn wir den Body in S3 als Flatfile speichern; jedoch könnten Sie zusätzliche Funktionalitäten wie Authentifizierungsprüfungen oder Fehlerbehandlung hinzufügen, falls benötigt.

Bei der Speicherung der Nutzlast in einem Flatfile auf S3 müssen wir den Namen des S3-Buckets, den Speicherort und den Dateinamen der Datei definieren, in der die Nutzlastdaten gespeichert werden. In unserer Beispiel-Lambda-Funktion machen wir dies innerhalb der „store_batch“-Funktion. In diesem Beispiel werden wir das gesamte Batch als einzelne Datei speichern, was dazu beiträgt, sicherzustellen, dass die Daten gesammelt und gespeichert werden, bevor die HTTP-Verbindung zwischen Bird und Ihrem Endpunkt abläuft. Während Sie die Verbindungstimeout-Einstellungen auf Ihrem Load Balancer anpassen könnten, gibt es keine Garantie, dass die Verbindung nicht auf der Übertragungsseite (in diesem Fall Bird) oder dass die Verbindung nicht beendet wird, bevor Ihre Lambda-Funktion fertig ausgeführt wird. Es ist eine bewährte Praxis, Ihre Konsumentfunktion so effizient wie möglich zu halten und Datenverarbeitungsaktivitäten für nachgelagerte Prozesse zu reservieren, wo möglich – wie das Konvertieren der batched JSON-formatierten Nutzlast in eine CSV-Datei oder das Laden der Ereignisdaten in eine Datenbank.

Es ist wichtig zu beachten, dass Sie möglicherweise die Berechtigungen für Ihre Lambda-Funktion aktualisieren müssen. Ihre Ausführungsrolle benötigt PutObject- und GetObject-Berechtigungen für S3. Es ist eine bewährte Praxis, das Prinzip der minimalen Rechte durchzusetzen, daher empfehle ich, diese Berechtigungen nur für den S3-Bucket festzulegen, in dem die Webhook-Nutzlasten gespeichert werden.

Ein Beispiel unserer Konsumenten-Lambda-Funktion finden Sie hier.

Ein kurzer Hinweis zur Batch-ID: Bird wird Ereignisse zu einer einzelnen Nutzlast bündeln, wobei jeder Batch 1 bis 350 oder mehr Ereignisdatensätze enthalten kann. Der Batch erhält eine eindeutige Batch-ID, die verwendet werden kann, um den Batch-Status entweder über die Nutzung der Event Webhooks API zu überprüfen oder innerhalb Ihres Bird-Kontos, indem Sie auf einen Webhook-Stream klicken und „Batch-Status“ auswählen. Falls eine Webhook-Nutzlast nicht zugestellt werden konnte, beispielsweise bei einem Verbindungstimeout, wird Bird automatisch den Batch erneut versuchen mit derselben Batch-ID. Dies kann passieren, wenn Ihre Lambda-Funktion nahe an der maximalen Round-Trip-Zeit von 10 Sekunden läuft und ist ein Grund, die Konsumentenfunktion zu optimieren, um die Ausführungszeit zu reduzieren.

Um alle Datenverarbeitungsaktivitäten zu bewältigen, empfehle ich, eine separate Lambda-Funktion zu erstellen, die immer dann ausgeführt wird, wenn eine neue Datei auf dem S3-Bucket erstellt wird – auf diese Weise wird die Datenverarbeitung asynchron zur Datenübertragung durchgeführt, und es besteht kein Risiko, Daten aufgrund einer unterbrochenen Verbindung zu verlieren. Ich bespreche die Verarbeitung der Lambda-Funktion in einem späteren Abschnitt.

Erstellen Sie einen Application Load Balancer

Um eine Webhook-Nutzlast zu empfangen, müssen wir einen Endpunkt bereitstellen, an den die Nutzlasten gesendet werden. Dies tun wir, indem wir einen Application Load Balancer innerhalb von AWS erstellen, indem wir zu EC2 > Load Balancers navigieren und auf „Load Balancer erstellen“ klicken. Sie werden aufgefordert, auszuwählen, welchen Typ von Load Balancer Sie erstellen möchten – dafür möchten wir einen Application Load Balancer erstellen. Wir müssen einen Application Load Balancer (ALB) verwenden, um unseren Konsumenten aufzubauen, da die Ereigniswebhooks als HTTP-Anforderung gesendet werden und ALBs zum Routing von HTTP-Anforderungen innerhalb von AWS verwendet werden. Wir könnten ein HTTP Gateway als Alternative implementieren; jedoch verwenden wir für dieses Projekt einen ALB, weil er leichter und kostengünstiger ist als ein HTTP Gateway. Es ist wichtig zu beachten, dass wenn Sie ein HTTP Gateway verwenden, das Ereignisformat möglicherweise anders ist als bei einem ALB und daher Ihre Lambda-Funktion das Anfrageobjekt entsprechend behandeln muss.

Sobald Ihr ALB erstellt ist, werden Sie aufgefordert, Ihrem ALB einen Namen zu geben und das Schema sowie die Zugangs-/Sicherheitseinstellungen zu konfigurieren – da wir planen, Ereignisdaten von einer externen Quelle (Bird) zu empfangen, möchten wir, dass unser ALB internetorientiert ist.  Unter „Listeners and routing“ sollte der ALB auf HTTPS auf Port 443 hören, und wir möchten eine Zielgruppe erstellen, die auf unsere Lambda-Funktion zeigt, damit unser ALB eingehende Anforderungen an die oben erstellte Konsumenten-Lambda-Funktion weiterleitet.  Sie müssen auch sicherstellen, dass die Sicherheitsgruppe die Berechtigung hat, Verkehr über Port 443 zu akzeptieren.

Erstellen Sie einen DNS-Eintrag für den Load Balancer

Um es einfacher zu machen, unseren ALB als Endpunkt zu nutzen, erstellen wir einen A-Record im DNS, der auf unseren ALB zeigt. Dafür können wir den AWS Route 53 Dienst (oder Ihren aktuellen DNS-Anbieter) verwenden und einen A-Record für den Hostnamen erstellen, den Sie für Ihren Endpunkt verwenden möchten (z.B. spevents.<your_domain>). Wenn Sie mit DNS in großem Maßstab auf AWS arbeiten, beachten Sie, dass es undokumentierte DNS-Grenzen gibt, die sich auf hochvolumige Anwendungen auswirken können, insbesondere solche, die große Mengen ausgehenden Datenverkehrs wie E-Mail-Zustellsysteme bewältigen. Der A-Record sollte so konfiguriert werden, dass er auf den von uns erstellten ALB zeigt. Wenn Sie Route 53 zur Verwaltung der DNS-Einträge verwenden, können Sie direkt auf die ALB-Instanz verweisen, indem Sie „Alias“ aktivieren und den ALB auswählen; andernfalls, wenn Sie einen externen DNS-Anbieter verwenden, sollten Sie den A-Record auf die öffentliche IP-Adresse der ALB-Instanz zeigen lassen.

Ich empfehle die Verwendung eines Tools wie Postman, um zu testen, ob alles korrekt konfiguriert wurde, bevor Sie Ihr Bird-Webhook aktivieren. Sie können eine POST-Anfrage an Ihren Endpunkt senden und bestätigen, dass eine Antwort empfangen wird. Wenn Ihre POST-Anfrage keine Antwort zurückgibt, müssen Sie möglicherweise überprüfen, ob Ihr ALB auf den richtigen Port hört.

Erstellen Sie ein Bird Webhook

Nun sind wir bereit, das Webhook in Bird zu erstellen und den zuvor definierten Hostnamen des A-Records als unseren Zielendpunkt zu verwenden. Um das Webhook zu erstellen, navigieren Sie zum Webhooks-Bereich in Ihrem Bird-Konto und klicken auf „Webhook erstellen“. Sie werden aufgefordert, Ihrem Webhook einen Namen zu geben und eine Ziel-URL bereitzustellen – das Ziel sollte der Hostname des zuvor erstellten A-Records sein. Beachten Sie, dass die Ziel-URL möglicherweise „HTTPS://“ in der URL enthalten muss.  

Sobald dies abgeschlossen ist, vergewissern Sie sich, dass das richtige Unterkonto und die richtigen Ereignisse ausgewählt sind, und drücken Sie „Webhook erstellen“, um Ihre Konfiguration zu speichern. Die Ereignisdaten für alle ausgewählten Ereignistypen werden nun an unsere Ziel-URL gestreamt und von unserem ALB für die Weiterverarbeitung konsumiert.

Verarbeitung von Webhook-Ereignisdaten

Je nach dem beabsichtigten Zweck für das Speichern der Bird-Ereignisdaten können Ihre Anforderungen möglicherweise bereits durch einfaches Speichern der JSON-Nutzdaten als Flachdatei erfüllt werden. Möglicherweise haben Sie auch bereits einen Downstream-ETL-Prozess eingerichtet, der in der Lage ist, Daten im JSON-Format zu konsumieren und zu laden. In beiden Fällen können Sie möglicherweise die Flachdatei verwenden, die von unserer oben erstellten Verarbeitungs-Lambda erzeugt wurde.

Alternativ müssen Sie möglicherweise die Daten umwandeln – beispielsweise von einem JSON- in ein CSV-Format – oder die Daten direkt in eine Datenbank laden. In diesem Beispiel werden wir eine einfache Lambda-Funktion erstellen, die die Webhook-Daten vom ursprünglichen JSON-Format in eine CSV-Datei konvertiert, die in eine Datenbank geladen werden könnte. 

Erstellen Sie eine Lambda, um die Daten zu verarbeiten

Wie bei der Lambda-Funktion zum Konsumieren der Webhook-Daten müssen wir eine neue Lambda-Funktion erstellen, indem wir zum Lambda-Dienst innerhalb von AWS navigieren und „Funktion erstellen“ drücken. Diese neue Lambda-Funktion wird ausgelöst, wenn eine neue Datei auf unserem S3-Bucket erstellt wird – sie wird die Daten lesen und in eine neue CSV-Datei konvertieren.  

Die Lambda-Funktion akzeptiert die Dateiinformationen als ein Ereignis. In der Beispiel-Lambda-Funktion sehen Sie, dass wir zuerst eine Reihe von Validierungsprüfungen durchführen, um sicherzustellen, dass die Daten vollständig und erwartungsgemäß formatiert sind. Anschließend konvertieren wir die JSON-Nutzdaten in eine CSV-Datei, indem wir die „csv“-Bibliothek verwenden und in eine temporäre Datei schreiben. Lambda-Funktionen können nur lokale Dateien im „/tmp“-Verzeichnis schreiben, daher erstellen wir eine temporäre CSV-Datei und benennen sie mit der Konvention <batch_id>.csv. Der Grund, warum wir das batch_id hier verwenden, ist einfach, um sicherzustellen, dass parallele Prozesse, die durch das Empfangen mehrerer Webhook-Nutzdaten ausgelöst werden, sich nicht gegenseitig stören, da jede Webhook-Batch ein eindeutiges batch_id haben wird.  

Sobald die Daten vollständig in CSV konvertiert sind, lesen wir die CSV-Daten als Bytestrom, löschen die temporäre Datei und speichern die CSV-Daten als neue Datei auf S3. Es ist wichtig zu beachten, dass für das Ergebnis ein anderer S3-Bucket benötigt wird, andernfalls riskieren wir das Erstellen einer rekursiven Schleife, die zu erhöhtem Lambda-Verbrauch und höheren Kosten führen kann. Wir müssen identifizieren, in welchem S3-Bucket und welcher Position wir unsere CSV-Datei innerhalb unserer Lambda-Funktion speichern möchten.  Befolgen Sie dasselbe Verfahren wie oben, um einen neuen S3-Bucket zu erstellen, um unsere CSV-Datei zu speichern.

Beachten Sie, dass das tmp-Verzeichnis auf 512 MB Speicherplatz begrenzt ist, daher ist es wichtig, die temporäre Datei danach zu löschen, um ausreichend Speicherplatz für zukünftige Ausführungen zu gewährleisten. Der Grund, warum wir eine temporäre Datei verwenden, anstatt direkt auf S3 zu schreiben, besteht darin, die Verbindung zu S3 durch eine einzelne Anfrage zu vereinfachen.

Genau wie bei der Konsum-Lambda-Funktion müssen Sie möglicherweise die Berechtigungen für Ihre Prozess-Lambda-Funktion aktualisieren. Diese Lambda-Funktion erfordert, dass die Ausführungsrolle GetObject-Berechtigungen für den Input-S3-Bucket und sowohl PutObject- als auch GetObject für den Output-S3-Bucket hat.

Ein Beispiel unserer Verarbeitungs-Lambda-Funktion finden Sie hier.

Konfigurieren Sie eine Lambda, um sie auszuführen, wenn neue Daten auf S3 gespeichert werden

Da unsere Lambda-Funktion zur Konvertierung der Datei von JSON- in CSV-Format erstellt wurde, müssen wir sie so konfigurieren, dass sie ausgelöst wird, wenn eine neue Datei auf unserem S3-Bucket erstellt wird. Hierfür müssen wir unserer Lambda-Funktion einen Trigger hinzufügen, indem wir unsere Lambda-Funktion öffnen und oben auf der Seite auf „Trigger hinzufügen“ klicken. Wählen Sie „S3“ und geben Sie den Namen des S3-Buckets an, in dem die rohen Webhook-Nutzdaten gespeichert sind. Sie haben auch die Möglichkeit, Datei-Prefix und/oder Suffix anzugeben, um zu filtern. Sobald die Einstellungen konfiguriert wurden, können Sie den Trigger hinzufügen, indem Sie unten auf der Seite auf „Hinzufügen“ klicken. Jetzt wird Ihre Verarbeitungs-Lambda-Funktion jedes Mal ausgeführt, wenn eine neue Datei zu Ihrem S3-Bucket hinzugefügt wird.

Laden der Daten in eine Datenbank

In diesem Beispiel werde ich das Laden der Daten in eine Datenbank nicht im Detail behandeln, aber wenn Sie diesem Beispiel gefolgt sind, haben Sie ein paar Optionen:

  1. Laden Sie die Daten direkt in Ihre Datenbank innerhalb Ihrer Verarbeitungs-Lambda-Funktion

  2. Konsumieren Sie Ihre CSV-Datei mit einem etablierten ETL-Prozess

Ob Sie einen AWS-Datenbankdienst verwenden, wie RDS oder DynamoDB, oder ob Sie Ihre eigene PostgreSQL-Datenbank (oder ähnliches) haben, Sie können direkt von Ihrer Prozess-Lambda-Funktion aus auf Ihren Datenbankdienst zugreifen. Beispielsweise können Sie, genauso wie wir den S3-Dienst mit „boto3“ in unserer Lambda-Funktion angesprochen haben, auch „boto3“ verwenden, um RDS oder DynamoDB anzusprechen. Der AWS Athena-Dienst könnte auch verwendet werden, um die Datendateien direkt von den Flachdateien zu lesen und auf die Daten mit einer Abfragesprache ähnlich SQL zuzugreifen. Ich empfehle, die jeweilige Dokumentation des Dienstes, den Sie verwenden, zu Rate zu ziehen, um weitere Informationen darüber zu erhalten, wie dies am besten in Ihrer Umgebung erreicht werden kann.

Ebenso gibt es viele Dienste, die dabei helfen können, CSV-Dateien zu konsumieren und die Daten in eine Datenbank zu laden. Möglicherweise haben Sie bereits einen etablierten ETL-Prozess, den Sie nutzen können.

Wir hoffen, dass Sie diesen Leitfaden hilfreich gefunden haben – viel Spaß beim Versenden!

Je nach dem beabsichtigten Zweck für das Speichern der Bird-Ereignisdaten können Ihre Anforderungen möglicherweise bereits durch einfaches Speichern der JSON-Nutzdaten als Flachdatei erfüllt werden. Möglicherweise haben Sie auch bereits einen Downstream-ETL-Prozess eingerichtet, der in der Lage ist, Daten im JSON-Format zu konsumieren und zu laden. In beiden Fällen können Sie möglicherweise die Flachdatei verwenden, die von unserer oben erstellten Verarbeitungs-Lambda erzeugt wurde.

Alternativ müssen Sie möglicherweise die Daten umwandeln – beispielsweise von einem JSON- in ein CSV-Format – oder die Daten direkt in eine Datenbank laden. In diesem Beispiel werden wir eine einfache Lambda-Funktion erstellen, die die Webhook-Daten vom ursprünglichen JSON-Format in eine CSV-Datei konvertiert, die in eine Datenbank geladen werden könnte. 

Erstellen Sie eine Lambda, um die Daten zu verarbeiten

Wie bei der Lambda-Funktion zum Konsumieren der Webhook-Daten müssen wir eine neue Lambda-Funktion erstellen, indem wir zum Lambda-Dienst innerhalb von AWS navigieren und „Funktion erstellen“ drücken. Diese neue Lambda-Funktion wird ausgelöst, wenn eine neue Datei auf unserem S3-Bucket erstellt wird – sie wird die Daten lesen und in eine neue CSV-Datei konvertieren.  

Die Lambda-Funktion akzeptiert die Dateiinformationen als ein Ereignis. In der Beispiel-Lambda-Funktion sehen Sie, dass wir zuerst eine Reihe von Validierungsprüfungen durchführen, um sicherzustellen, dass die Daten vollständig und erwartungsgemäß formatiert sind. Anschließend konvertieren wir die JSON-Nutzdaten in eine CSV-Datei, indem wir die „csv“-Bibliothek verwenden und in eine temporäre Datei schreiben. Lambda-Funktionen können nur lokale Dateien im „/tmp“-Verzeichnis schreiben, daher erstellen wir eine temporäre CSV-Datei und benennen sie mit der Konvention <batch_id>.csv. Der Grund, warum wir das batch_id hier verwenden, ist einfach, um sicherzustellen, dass parallele Prozesse, die durch das Empfangen mehrerer Webhook-Nutzdaten ausgelöst werden, sich nicht gegenseitig stören, da jede Webhook-Batch ein eindeutiges batch_id haben wird.  

Sobald die Daten vollständig in CSV konvertiert sind, lesen wir die CSV-Daten als Bytestrom, löschen die temporäre Datei und speichern die CSV-Daten als neue Datei auf S3. Es ist wichtig zu beachten, dass für das Ergebnis ein anderer S3-Bucket benötigt wird, andernfalls riskieren wir das Erstellen einer rekursiven Schleife, die zu erhöhtem Lambda-Verbrauch und höheren Kosten führen kann. Wir müssen identifizieren, in welchem S3-Bucket und welcher Position wir unsere CSV-Datei innerhalb unserer Lambda-Funktion speichern möchten.  Befolgen Sie dasselbe Verfahren wie oben, um einen neuen S3-Bucket zu erstellen, um unsere CSV-Datei zu speichern.

Beachten Sie, dass das tmp-Verzeichnis auf 512 MB Speicherplatz begrenzt ist, daher ist es wichtig, die temporäre Datei danach zu löschen, um ausreichend Speicherplatz für zukünftige Ausführungen zu gewährleisten. Der Grund, warum wir eine temporäre Datei verwenden, anstatt direkt auf S3 zu schreiben, besteht darin, die Verbindung zu S3 durch eine einzelne Anfrage zu vereinfachen.

Genau wie bei der Konsum-Lambda-Funktion müssen Sie möglicherweise die Berechtigungen für Ihre Prozess-Lambda-Funktion aktualisieren. Diese Lambda-Funktion erfordert, dass die Ausführungsrolle GetObject-Berechtigungen für den Input-S3-Bucket und sowohl PutObject- als auch GetObject für den Output-S3-Bucket hat.

Ein Beispiel unserer Verarbeitungs-Lambda-Funktion finden Sie hier.

Konfigurieren Sie eine Lambda, um sie auszuführen, wenn neue Daten auf S3 gespeichert werden

Da unsere Lambda-Funktion zur Konvertierung der Datei von JSON- in CSV-Format erstellt wurde, müssen wir sie so konfigurieren, dass sie ausgelöst wird, wenn eine neue Datei auf unserem S3-Bucket erstellt wird. Hierfür müssen wir unserer Lambda-Funktion einen Trigger hinzufügen, indem wir unsere Lambda-Funktion öffnen und oben auf der Seite auf „Trigger hinzufügen“ klicken. Wählen Sie „S3“ und geben Sie den Namen des S3-Buckets an, in dem die rohen Webhook-Nutzdaten gespeichert sind. Sie haben auch die Möglichkeit, Datei-Prefix und/oder Suffix anzugeben, um zu filtern. Sobald die Einstellungen konfiguriert wurden, können Sie den Trigger hinzufügen, indem Sie unten auf der Seite auf „Hinzufügen“ klicken. Jetzt wird Ihre Verarbeitungs-Lambda-Funktion jedes Mal ausgeführt, wenn eine neue Datei zu Ihrem S3-Bucket hinzugefügt wird.

Laden der Daten in eine Datenbank

In diesem Beispiel werde ich das Laden der Daten in eine Datenbank nicht im Detail behandeln, aber wenn Sie diesem Beispiel gefolgt sind, haben Sie ein paar Optionen:

  1. Laden Sie die Daten direkt in Ihre Datenbank innerhalb Ihrer Verarbeitungs-Lambda-Funktion

  2. Konsumieren Sie Ihre CSV-Datei mit einem etablierten ETL-Prozess

Ob Sie einen AWS-Datenbankdienst verwenden, wie RDS oder DynamoDB, oder ob Sie Ihre eigene PostgreSQL-Datenbank (oder ähnliches) haben, Sie können direkt von Ihrer Prozess-Lambda-Funktion aus auf Ihren Datenbankdienst zugreifen. Beispielsweise können Sie, genauso wie wir den S3-Dienst mit „boto3“ in unserer Lambda-Funktion angesprochen haben, auch „boto3“ verwenden, um RDS oder DynamoDB anzusprechen. Der AWS Athena-Dienst könnte auch verwendet werden, um die Datendateien direkt von den Flachdateien zu lesen und auf die Daten mit einer Abfragesprache ähnlich SQL zuzugreifen. Ich empfehle, die jeweilige Dokumentation des Dienstes, den Sie verwenden, zu Rate zu ziehen, um weitere Informationen darüber zu erhalten, wie dies am besten in Ihrer Umgebung erreicht werden kann.

Ebenso gibt es viele Dienste, die dabei helfen können, CSV-Dateien zu konsumieren und die Daten in eine Datenbank zu laden. Möglicherweise haben Sie bereits einen etablierten ETL-Prozess, den Sie nutzen können.

Wir hoffen, dass Sie diesen Leitfaden hilfreich gefunden haben – viel Spaß beim Versenden!

Je nach dem beabsichtigten Zweck für das Speichern der Bird-Ereignisdaten können Ihre Anforderungen möglicherweise bereits durch einfaches Speichern der JSON-Nutzdaten als Flachdatei erfüllt werden. Möglicherweise haben Sie auch bereits einen Downstream-ETL-Prozess eingerichtet, der in der Lage ist, Daten im JSON-Format zu konsumieren und zu laden. In beiden Fällen können Sie möglicherweise die Flachdatei verwenden, die von unserer oben erstellten Verarbeitungs-Lambda erzeugt wurde.

Alternativ müssen Sie möglicherweise die Daten umwandeln – beispielsweise von einem JSON- in ein CSV-Format – oder die Daten direkt in eine Datenbank laden. In diesem Beispiel werden wir eine einfache Lambda-Funktion erstellen, die die Webhook-Daten vom ursprünglichen JSON-Format in eine CSV-Datei konvertiert, die in eine Datenbank geladen werden könnte. 

Erstellen Sie eine Lambda, um die Daten zu verarbeiten

Wie bei der Lambda-Funktion zum Konsumieren der Webhook-Daten müssen wir eine neue Lambda-Funktion erstellen, indem wir zum Lambda-Dienst innerhalb von AWS navigieren und „Funktion erstellen“ drücken. Diese neue Lambda-Funktion wird ausgelöst, wenn eine neue Datei auf unserem S3-Bucket erstellt wird – sie wird die Daten lesen und in eine neue CSV-Datei konvertieren.  

Die Lambda-Funktion akzeptiert die Dateiinformationen als ein Ereignis. In der Beispiel-Lambda-Funktion sehen Sie, dass wir zuerst eine Reihe von Validierungsprüfungen durchführen, um sicherzustellen, dass die Daten vollständig und erwartungsgemäß formatiert sind. Anschließend konvertieren wir die JSON-Nutzdaten in eine CSV-Datei, indem wir die „csv“-Bibliothek verwenden und in eine temporäre Datei schreiben. Lambda-Funktionen können nur lokale Dateien im „/tmp“-Verzeichnis schreiben, daher erstellen wir eine temporäre CSV-Datei und benennen sie mit der Konvention <batch_id>.csv. Der Grund, warum wir das batch_id hier verwenden, ist einfach, um sicherzustellen, dass parallele Prozesse, die durch das Empfangen mehrerer Webhook-Nutzdaten ausgelöst werden, sich nicht gegenseitig stören, da jede Webhook-Batch ein eindeutiges batch_id haben wird.  

Sobald die Daten vollständig in CSV konvertiert sind, lesen wir die CSV-Daten als Bytestrom, löschen die temporäre Datei und speichern die CSV-Daten als neue Datei auf S3. Es ist wichtig zu beachten, dass für das Ergebnis ein anderer S3-Bucket benötigt wird, andernfalls riskieren wir das Erstellen einer rekursiven Schleife, die zu erhöhtem Lambda-Verbrauch und höheren Kosten führen kann. Wir müssen identifizieren, in welchem S3-Bucket und welcher Position wir unsere CSV-Datei innerhalb unserer Lambda-Funktion speichern möchten.  Befolgen Sie dasselbe Verfahren wie oben, um einen neuen S3-Bucket zu erstellen, um unsere CSV-Datei zu speichern.

Beachten Sie, dass das tmp-Verzeichnis auf 512 MB Speicherplatz begrenzt ist, daher ist es wichtig, die temporäre Datei danach zu löschen, um ausreichend Speicherplatz für zukünftige Ausführungen zu gewährleisten. Der Grund, warum wir eine temporäre Datei verwenden, anstatt direkt auf S3 zu schreiben, besteht darin, die Verbindung zu S3 durch eine einzelne Anfrage zu vereinfachen.

Genau wie bei der Konsum-Lambda-Funktion müssen Sie möglicherweise die Berechtigungen für Ihre Prozess-Lambda-Funktion aktualisieren. Diese Lambda-Funktion erfordert, dass die Ausführungsrolle GetObject-Berechtigungen für den Input-S3-Bucket und sowohl PutObject- als auch GetObject für den Output-S3-Bucket hat.

Ein Beispiel unserer Verarbeitungs-Lambda-Funktion finden Sie hier.

Konfigurieren Sie eine Lambda, um sie auszuführen, wenn neue Daten auf S3 gespeichert werden

Da unsere Lambda-Funktion zur Konvertierung der Datei von JSON- in CSV-Format erstellt wurde, müssen wir sie so konfigurieren, dass sie ausgelöst wird, wenn eine neue Datei auf unserem S3-Bucket erstellt wird. Hierfür müssen wir unserer Lambda-Funktion einen Trigger hinzufügen, indem wir unsere Lambda-Funktion öffnen und oben auf der Seite auf „Trigger hinzufügen“ klicken. Wählen Sie „S3“ und geben Sie den Namen des S3-Buckets an, in dem die rohen Webhook-Nutzdaten gespeichert sind. Sie haben auch die Möglichkeit, Datei-Prefix und/oder Suffix anzugeben, um zu filtern. Sobald die Einstellungen konfiguriert wurden, können Sie den Trigger hinzufügen, indem Sie unten auf der Seite auf „Hinzufügen“ klicken. Jetzt wird Ihre Verarbeitungs-Lambda-Funktion jedes Mal ausgeführt, wenn eine neue Datei zu Ihrem S3-Bucket hinzugefügt wird.

Laden der Daten in eine Datenbank

In diesem Beispiel werde ich das Laden der Daten in eine Datenbank nicht im Detail behandeln, aber wenn Sie diesem Beispiel gefolgt sind, haben Sie ein paar Optionen:

  1. Laden Sie die Daten direkt in Ihre Datenbank innerhalb Ihrer Verarbeitungs-Lambda-Funktion

  2. Konsumieren Sie Ihre CSV-Datei mit einem etablierten ETL-Prozess

Ob Sie einen AWS-Datenbankdienst verwenden, wie RDS oder DynamoDB, oder ob Sie Ihre eigene PostgreSQL-Datenbank (oder ähnliches) haben, Sie können direkt von Ihrer Prozess-Lambda-Funktion aus auf Ihren Datenbankdienst zugreifen. Beispielsweise können Sie, genauso wie wir den S3-Dienst mit „boto3“ in unserer Lambda-Funktion angesprochen haben, auch „boto3“ verwenden, um RDS oder DynamoDB anzusprechen. Der AWS Athena-Dienst könnte auch verwendet werden, um die Datendateien direkt von den Flachdateien zu lesen und auf die Daten mit einer Abfragesprache ähnlich SQL zuzugreifen. Ich empfehle, die jeweilige Dokumentation des Dienstes, den Sie verwenden, zu Rate zu ziehen, um weitere Informationen darüber zu erhalten, wie dies am besten in Ihrer Umgebung erreicht werden kann.

Ebenso gibt es viele Dienste, die dabei helfen können, CSV-Dateien zu konsumieren und die Daten in eine Datenbank zu laden. Möglicherweise haben Sie bereits einen etablierten ETL-Prozess, den Sie nutzen können.

Wir hoffen, dass Sie diesen Leitfaden hilfreich gefunden haben – viel Spaß beim Versenden!

Lassen Sie uns Sie mit einem Bird-Experten verbinden.
Erleben Sie die volle Macht des Bird in 30 Minuten.

Durch die Übermittlung stimmen Sie zu, dass Bird Sie bezüglich unserer Produkte und Dienstleistungen kontaktieren darf.

Sie können sich jederzeit abmelden. Weitere Informationen zur Datenverarbeitung finden Sie in Birds Datenschutzerklärung.

Unternehmen

Newsletter

Bleiben Sie mit Bird auf dem Laufenden durch wöchentliche Updates in Ihrem Posteingang.

Lassen Sie uns Sie mit einem Bird-Experten verbinden.
Erleben Sie die volle Macht des Bird in 30 Minuten.

Durch die Übermittlung stimmen Sie zu, dass Bird Sie bezüglich unserer Produkte und Dienstleistungen kontaktieren darf.

Sie können sich jederzeit abmelden. Weitere Informationen zur Datenverarbeitung finden Sie in Birds Datenschutzerklärung.

Unternehmen

Newsletter

Bleiben Sie mit Bird auf dem Laufenden durch wöchentliche Updates in Ihrem Posteingang.

Lassen Sie uns Sie mit einem Bird-Experten verbinden.
Erleben Sie die volle Macht des Bird in 30 Minuten.

Durch die Übermittlung stimmen Sie zu, dass Bird Sie bezüglich unserer Produkte und Dienstleistungen kontaktieren darf.

Sie können sich jederzeit abmelden. Weitere Informationen zur Datenverarbeitung finden Sie in Birds Datenschutzerklärung.

R

Erreichen

G

Grow

M

Manage

A

Automate

Unternehmen

Newsletter

Bleiben Sie mit Bird auf dem Laufenden durch wöchentliche Updates in Ihrem Posteingang.