Bereik

Grow

Manage

Automate

Bereik

Grow

Manage

Automate

Het maken en gebruiken van Bird-webhooks

Bird

27 jan 2022

E-mail

1 min read

Het maken en gebruiken van Bird-webhooks

Bird

27 jan 2022

E-mail

1 min read

Het maken en gebruiken van Bird-webhooks

De volgende is een eenvoudige gids om afzenders te helpen zich op hun gemak te voelen bij het creëren van een Bird-evenementwebhook en het gebruiken van de gegevens met behulp van de infrastructuur binnen AWS.

Bird’s real-time event webhooks zijn een ongelooflijk waardevol hulpmiddel voor verzenders om gegevens automatisch naar hun systemen te laten pushen. Dit kan downstream-automatisering aandrijven, zoals het bijwerken van mailinglijsten, het activeren van geautomatiseerde e-mailreizen of het vullen van interne dashboards. Hoewel dezelfde gebeurtenisgegevens toegankelijk zijn via de Bird UI met Event Search of programmeerbaar door gebruik te maken van de Bird Events API, kunnen beperkingen op het aantal records dat in één verzoek wordt geretourneerd of snelheidslimieten op het API-eindpunt beide methoden restrictief maken voor grote en geavanceerde verzenders.  

Real-time event webhooks stellen een verzender in staat om een eindpunt te configureren waar Bird de gegevens naar verzendt, en de gegevens kunnen worden verwerkt zonder cron-jobs in te plannen die de gegevens ophalen. Er zijn ook logistieke afwegingen bij het ophalen van de gegevens in plaats van deze naar u te laten pushen, zoals het identificeren van welke tijdsperiode en parameters voor elk API-verzoek moeten worden gebruikt. Als de tijdsperioden niet perfect zijn uitgelijnd, riskeert u gegevens te missen, en als de tijdsperioden overlappen, moet u dubbele gegevensrecords verwerken. Met real-time webhooks worden gegevens van gebeurtenissen eenvoudig naar uw eindpunt gepusht zodra deze binnen Bird beschikbaar komen.

Hoewel de voordelen van het ontvangen van gebeurtenisgegevens in real-time om downstream-automatiseringsprocessen aan te drijven voor veel verzenders onmiddellijk begrijpelijk kunnen zijn, kan het daadwerkelijke proces voor het implementeren en verwerken van webhooks intimiderend zijn. Dit kan vooral gelden als u onbekend bent met de technische componenten voor het maken van een eindpunt en het programmatisch verwerken van de gegevens. Er zijn diensten beschikbaar die Bird-webhookgegevens verbruiken en automatisch ETL in uw database - een voorbeeld zou StitchData zijn, waarover we in het verleden hebben geblogd.  Als u echter meer controle over het proces wilt, kunt u de componenten gemakkelijk zelf bouwen. Het volgende is een eenvoudige gids om verzenders op hun gemak te laten voelen bij het maken van een Bird events webhook en het verwerken van de gegevens met behulp van de infrastructuur binnen AWS.

Configureren van de Webhook Target Endpoint

Wanneer een Bird evenement wordt aangemaakt, willen we dat die evenementgegevens in realtime naar een eindpunt in AWS worden gestreamd, zodat we die gegevens programmatisch kunnen gebruiken en verwerken. De gegevens worden van Bird naar een doel-eindpunt gestuurd, dat de payload doorstuurt naar een lambda-functie die de gegevens verwerkt en opslaat in een S3-bucket. Een diagram op hoog niveau van de beschreven gegevensstroom is hieronder te zien:


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)'.


Om deze workflow te implementeren, gaan we deze omgekeerd opbouwen, te beginnen met het creëren van een S3-bucket waar we onze evenementgegevens zullen opslaan en vervolgens achteruit werken - elk onderdeel dat in wat we hebben opgebouwd toevoegd.

Maak een S3 Bucket om de Webhook Data op te slaan

Voordat we onze load balancer maken om de gegevens te accepteren, of onze lambda-functie om de gegevens op te slaan, moeten we eerst onze S3-bucket maken waar de gegevens worden opgeslagen. Hoewel S3 uitstekende opslag biedt voor webhook-gegevens, moeten organisaties die ook PostgreSQL-databases voor evenementverwerking gebruiken, passende backup- en herstelprocedures implementeren om hun gestructureerde gegevens te beschermen naast hun S3-opslagstrategie. Om dit te doen, navigeert u naar de S3-service binnen AWS en drukt u op 'Create Bucket'. U wordt gevraagd om een naam toe te wijzen aan uw bucket en de regio in te stellen - zorg ervoor dat u dezelfde regio gebruikt als uw ALB en lambda-functie. Wanneer uw S3-bucket is gemaakt, is deze leeg - als u de gegevens binnen een map wilt organiseren, kunt u nu de bedoelde directory maken, of de directory wordt gemaakt wanneer uw lambda-functie het bestand opslaat. In dit voorbeeld hebben we onze S3-bucket 'bird-webhooks' genoemd en een map genaamd 'B Event Data' gemaakt om onze evenementgegevens op te slaan - u zult deze namen zien terugkomen in onze lambda-functie hieronder.

Maak een Lambda-functie om de Gegevens te Verbruiken

De daadwerkelijke verwerking en opslag van de gegevens wordt uitgevoerd door een lambda-functie die wordt opgeroepen door onze application load balancer (ALB). 

De eerste stap is om uw lambda-functie te maken door naar de Lambda-service binnen AWS te navigeren en op 'Create Function' te klikken. U wordt gevraagd een naam toe te wijzen aan uw lambda-functie en te selecteren in welke programmeertaal u uw functie wilt schrijven. Voor dit voorbeeld gebruiken we Python als de runtime taal.

Nu moeten we onze lambda-functie ontwikkelen. Laten we er even vanuit gaan dat onze application load balancer is geconfigureerd en de webhook-payload doorstuurt naar onze lambda-functie - de lambda ontvangt een payload inclusief de volledige headers en body. De payload wordt in onze lambda-functie doorgegeven met behulp van het object 'event' als een dictionary. U kunt de headers en de body van de payload onafhankelijk benaderen door de 'headers' en 'body' objecten binnen de payload te benaderen. In dit voorbeeld gaan we simpelweg de 'x-messagesystems-batch-id' header lezen, waar de batch-ID een unieke waarde is die door Bird voor de webhook-batch is gecreëerd, en deze gebruiken als de bestandsnaam wanneer de body als een flat-file in S3 wordt opgeslagen; u wilt echter mogelijk extra functionaliteit toevoegen zoals authenticatiecontroles of foutafhandeling, indien nodig.

Bij het opslaan van de payload naar een flat-file in S3 moeten we de naam van de S3-bucket, locatie en bestandsnaam van het bestand waar de payloadgegevens worden opgeslagen, definiëren. In onze voorbeeld lambda-functie doen we dit binnen de 'store_batch' functie. In dit voorbeeld gaan we de hele batch opslaan als een enkel bestand, wat helpt ervoor te zorgen dat de gegevens worden verzameld en opgeslagen voordat de HTTP-verbinding tussen Bird en uw eindpunt wordt verbroken. Hoewel u de time-outinstellingen van de verbinding op uw load balancer zou kunnen aanpassen, zijn er geen garanties dat de verbinding niet aan de verzendzijde (in dit geval Bird) verloopt of dat de verbinding niet wordt beëindigd voordat uw lambda-functie klaar is met uitvoeren. Het is een beste praktijk om uw consumer-functie zo efficiënt mogelijk te houden en gegevensverwerkingsactiviteiten te reserveren voor downstream-processen waar mogelijk - zoals het converteren van de gebatchte JSON-geformatteerde payload naar een CSV-bestand, of het laden van de evenementgegevens in een database.

Het is belangrijk op te merken dat u mogelijk de machtigingen voor uw lambda-functie moet bijwerken. Uw uitvoeringsrol heeft PutObject- en GetObject-machtigingen voor S3 nodig. Het is een beste praktijk om het principe van het minste privilege te handhaven, dus ik raad aan deze machtigingen in te stellen voor alleen de S3-bucket waar de webhook-payloads worden opgeslagen.

Een voorbeeld van onze consumer lambda-functie is te vinden hier.

Als een korte opmerking over de batch-ID:  Bird zal evenementen groeperen in een enkele payload, waarbij elke batch 1 tot 350 of meer gebeurtenisrecords kan bevatten.  De batch krijgt een unieke batch-ID, die kan worden gebruikt om de batchstatus te bekijken door gebruik te maken van de Event Webhooks API of binnen uw Bird account door te klikken op een webhook stroom en 'Batch Status' te selecteren. In het geval dat een webhook-payload niet kon worden afgeleverd, zoals bij een connection timeout, zal Bird automatisch de batch opnieuw proberen met dezelfde batch-ID. Dit kan gebeuren wanneer uw lambda-functie dicht bij de maximale round-trip tijd van 10 seconden draait en is een reden om de consumer-functie te optimaliseren om de uitvoeringstijd te verkorten.

Om alle gegevensverwerkingsactiviteiten af te handelen, raad ik aan een aparte lambda-functie te maken die wordt uitgevoerd telkens wanneer een nieuw bestand in de S3-bucket wordt aangemaakt - op deze manier wordt de gegevensverwerking asynchroon uitgevoerd aan de gegevensoverdracht, en is er geen risico op gegevensverlies door een beëindigde verbinding. Ik bespreek de verwerkings lambda-functie in een latere sectie.

Maak een Application Load Balancer

Om een webhook-payload te ontvangen, moeten we een eindpunt bieden om de payloads naar toe te sturen. We doen dit door een application load balancer binnen AWS te maken door te navigeren naar EC2 > Load Balancers en op 'Create Load Balancer' te klikken. U wordt gevraagd om te kiezen welk type load balancer u wilt maken - hiervoor willen we een application load balancer maken. We moeten een application load balancer (ALB) gebruiken om onze consument te bouwen omdat de evenementen-webhooks worden verzonden als een HTTP-verzoek, en ALB's worden gebruikt voor het routeren van HTTP-verzoeken binnen AWS. We zouden als alternatief een HTTP Gateway kunnen implementeren; we gebruiken echter een ALB voor dit project omdat het lichter en kosteneffectiever is dan HTTP Gateway. Het is belangrijk op te merken dat als u een HTTP Gateway kiest, het evenementformaat anders kan zijn dan bij een ALB, en daarom moet uw lambda-functie het aanvraagobject dienovereenkomstig afhandelen.

Zodra uw ALB is gemaakt, wordt u gevraagd een naam toe te wijzen aan uw ALB en het schema en de toegang-/beveiligingsinstellingen te configureren - aangezien we van plan zijn om gegevens van een externe bron (Bird) te ontvangen, willen we dat onze ALB internet-facing is.  Onder 'Listeners and routing', moet de ALB luisteren naar HTTPS op poort 443, en we willen een Target-groep aanmaken die wijst naar onze lambda-functie, zodat onze ALB inkomende verzoeken doorstuurt naar de consume lambda-functie die we hierboven hebben gemaakt.  U moet er ook voor zorgen dat de beveiligingsgroep toestemming heeft om verkeer via poort 443 te accepteren.

Maak een DNS Record voor de Load Balancer

Om het voor ons gemakkelijker te maken onze ALB als een eindpunt te gebruiken, maken we een A-record in DNS dat wijst naar onze ALB. Hiervoor kunnen we de AWS Route 53-service (of uw huidige DNS-provider) gebruiken en een A-record maken voor de hostnaam die u wilt gebruiken voor uw eindpunt (bijv. spevents.<your_domain>). Wanneer u werkt met DNS op schaal op AWS, houd er rekening mee dat er ongedocumenteerde DNS-limieten zijn die van invloed kunnen zijn op toepassingen met een hoog volume, vooral die welke grote hoeveelheden uitgaand verkeer verwerken zoals e-mailafleveringssystemen. Het A-record moet zo worden geconfigureerd dat het naar de door ons gemaakte ALB wijst. Als u Route 53 gebruikt voor het beheren van de DNS-records, kunt u de ALB-instantie direct refereren door 'Alias' in te schakelen en de ALB te selecteren; anders, als u een externe DNS-provider gebruikt, moet u het A-record laten wijzen naar het openbare IP-adres van de ALB-instantie.

Ik raad aan een tool zoals Postman te gebruiken om te testen of alles correct is geconfigureerd voordat u uw Bird-webhook inschakelt. U kunt een POST-verzoek naar uw eindpunt doen en bevestigen dat een reactie wordt ontvangen. Als uw POST-verzoek geen reactie retourneert, moet u misschien dubbel controleren of uw ALB naar de juiste poort luistert.

Maak een Bird Webhook

Nu zijn we klaar om de webhook in Bird te maken en de hostnaam te gebruiken die is gedefinieerd door het A-record hierboven als ons doeleindpunt. Om de webhook te maken, navigeert u naar het Webhooks-gedeelte binnen uw Bird-account en klikt u op 'Create Webhook'. U wordt gevraagd een naam toe te wijzen aan uw webhook en een doel-URL op te geven - het doel moet de hostnaam zijn van het eerder gemaakte A-record. Merk op dat de doel-URL mogelijk vereist dat 'HTTPS://' in de URL is opgenomen.  

Nadat u klaar bent, controleert u of het juiste subaccount en de juiste evenementen zijn geselecteerd en drukt u op 'Create Webhook' om uw configuratie op te slaan. De evenementgegevens voor alle geselecteerde evenemententypen zullen nu naar onze doel-URL stromen en worden opgeconsumeerd door onze ALB voor downstream-verwerking.

Het verwerken van Webhook Event Data

Afhankelijk van het beoogde doel voor het opslaan van de Bird evenementgegevens, kunnen uw vereisten worden voldaan door simpelweg de JSON-payload als een platte bestand op te slaan. U kunt ook al een downstream ETL-proces hebben ingesteld dat in staat is om gegevens in een JSON-indeling te consumeren en te laden. In beide gevallen kunt u mogelijk het platte bestand gebruiken dat door onze verwerkingslambda die we hierboven hebben gemaakt, is gecreëerd.

Alternatief kan het nodig zijn om de gegevens te transformeren – zoals om te zetten van een JSON naar een CSV-indeling – of de gegevens direct in een database te laden. In dit voorbeeld zullen we een eenvoudige lambda-functie maken die de webhookgegevens van het originele JSON-formaat naar een CSV-bestand zal converteren dat in een database kan worden geladen. 

Creëer een Lambda om de Gegevens te Verwerken

Net als bij de lambda-functie om de webhookgegevens te consumeren, moeten we een nieuwe lambda-functie creëren door naar de Lambda-service binnen AWS te navigeren en op “Create Function” te drukken. Deze nieuwe lambda-functie wordt geactiveerd wanneer een nieuw bestand op onze S3 bucket wordt aangemaakt – het zal de gegevens lezen en omzetten in een nieuw csv-bestand.  

De lambda-functie accepteert de bestandsinformatie als een evenement. In de voorbeeld lambda-functie ziet u dat we eerst een reeks validatiecontroles hebben om ervoor te zorgen dat de gegevens compleet en geformatteerd zijn zoals verwacht. Vervolgens zetten we de JSON-payload om in een CSV-bestand met behulp van de “csv” bibliotheek en schrijven naar een tijdelijk bestand. Lambda-functies kunnen alleen lokale bestanden naar de “/tmp” directory schrijven, dus maken we een tijdelijk csv-bestand en benoemen het met de conventie <batch_id>.csv. De reden dat we hier de batch_id gebruiken is eenvoudigweg om ervoor te zorgen dat eventuele parallelle processen die worden uitgevoerd als gevolg van het ontvangen van meerdere webhook-payloads elkaar niet storen, omdat elke webhook-batch een unieke batch_id heeft.  

Zodra de gegevens volledig naar CSV zijn geconverteerd, lezen we de CSV-gegevens als een bytestroom, verwijderen het tijdelijke bestand en slaan de CSV-gegevens op als een nieuw bestand op S3. Het is belangrijk op te merken dat een andere S3 bucket nodig is voor de uitvoer, anders lopen we het risico een recursieve lus te creëren die kan resulteren in verhoogd lambda-gebruik en verhoogde kosten. We moeten identificeren in welke S3 bucket en locatie we willen dat ons CSV-bestand wordt opgeslagen binnen onze lambda-functie. Volg dezelfde procedure als hierboven om een nieuwe S3 bucket te maken om ons CSV-bestand op te slaan.

Merk op dat de tmp-directory beperkt is tot 512 MB ruimte, dus is het belangrijk dat het tijdelijke bestand daarna wordt verwijderd om voldoende ruimte voor toekomstige uitvoeringen te garanderen. De reden dat we een tijdelijk bestand gebruiken in plaats van direct naar S3 te schrijven, is om de verbinding met S3 te vereenvoudigen door slechts één verzoek te hebben.

Net als bij de consume-lambda-functie, moet u mogelijk de permissies voor uw process-lambda-functie bijwerken. Deze lambda-functie vereist dat de uitvoeringsrol GetObject-permissies heeft voor de invoer S3 bucket, en zowel PutObject als GetObject voor de uitvoer S3 bucket.

Een voorbeeld van onze verwerkingslambda-functie is te vinden hier.

Configureer een Lambda om te Worden Uitgevoerd Wanneer Nieuwe Gegevens op S3 Worden Opgeslagen

Nu onze lambda-functie om het bestand van JSON naar CSV-indeling te converteren is gecreëerd, moeten we het configureren om geactiveerd te worden wanneer een nieuw bestand op onze S3 bucket wordt aangemaakt. Om dit te doen, moeten we een trigger toevoegen aan onze lambda-functie door onze lambda-functie te openen en op “Add Trigger” aan de bovenkant van de pagina te klikken. Selecteer “S3” en geef de naam van de S3 bucket op waar de ruwe webhook-payloads worden opgeslagen. U heeft ook de optie om een bestandsvoorvoegsel en/of -achtervoegsel op te geven om op te filteren. Zodra de instellingen zijn geconfigureerd, kunt u de trigger toevoegen door onderaan op “Add” te klikken. Nu zal uw verwerkingslambda-functie worden uitgevoerd wanneer een nieuw bestand aan uw S3 bucket wordt toegevoegd.

Het Laden van de Gegevens in een Database

In dit voorbeeld zal ik het laden van de gegevens in een database niet in detail behandelen, maar als u met dit voorbeeld bent meegelezen, heeft u een paar opties:

  1. Laad de gegevens rechtstreeks in uw database binnen uw verwerkingslambda-functie

  2. Consumeer uw CSV-bestand met behulp van een vastgesteld ETL-proces

Of u nu een AWS-databaseservice gebruikt, zoals RDS of DynamoDB, of u heeft uw eigen PostgreSQL-database (of een vergelijkbare), u kunt rechtstreeks vanaf uw proceslambda-functie verbinding maken met uw databaseservice. Bijvoorbeeld, op dezelfde manier waarop we de S3-service hebben aangeroepen met behulp van “boto3” in onze lambda-functie, kunt u ook “boto3” gebruiken om RDS of DynamoDB aan te roepen. De AWS Athena service kan ook worden gebruikt om de gegevensbestanden rechtstreeks te lezen van de platte bestanden, en toegang te krijgen tot de gegevens met behulp van een querytaal die vergelijkbaar is met SQL. Ik raad aan de respectieve documentatie van de service die u gebruikt te raadplegen voor meer informatie over de beste manier om dit binnen uw omgeving te realiseren.

Evenzo zijn er veel services beschikbaar die kunnen helpen om CSV-bestanden te consumeren en de gegevens in een database te laden. U heeft mogelijk al een gevestigd ETL-proces dat u kunt gebruiken.

We hopen dat u deze gids nuttig vond – veel succes met verzenden!

Afhankelijk van het beoogde doel voor het opslaan van de Bird evenementgegevens, kunnen uw vereisten worden voldaan door simpelweg de JSON-payload als een platte bestand op te slaan. U kunt ook al een downstream ETL-proces hebben ingesteld dat in staat is om gegevens in een JSON-indeling te consumeren en te laden. In beide gevallen kunt u mogelijk het platte bestand gebruiken dat door onze verwerkingslambda die we hierboven hebben gemaakt, is gecreëerd.

Alternatief kan het nodig zijn om de gegevens te transformeren – zoals om te zetten van een JSON naar een CSV-indeling – of de gegevens direct in een database te laden. In dit voorbeeld zullen we een eenvoudige lambda-functie maken die de webhookgegevens van het originele JSON-formaat naar een CSV-bestand zal converteren dat in een database kan worden geladen. 

Creëer een Lambda om de Gegevens te Verwerken

Net als bij de lambda-functie om de webhookgegevens te consumeren, moeten we een nieuwe lambda-functie creëren door naar de Lambda-service binnen AWS te navigeren en op “Create Function” te drukken. Deze nieuwe lambda-functie wordt geactiveerd wanneer een nieuw bestand op onze S3 bucket wordt aangemaakt – het zal de gegevens lezen en omzetten in een nieuw csv-bestand.  

De lambda-functie accepteert de bestandsinformatie als een evenement. In de voorbeeld lambda-functie ziet u dat we eerst een reeks validatiecontroles hebben om ervoor te zorgen dat de gegevens compleet en geformatteerd zijn zoals verwacht. Vervolgens zetten we de JSON-payload om in een CSV-bestand met behulp van de “csv” bibliotheek en schrijven naar een tijdelijk bestand. Lambda-functies kunnen alleen lokale bestanden naar de “/tmp” directory schrijven, dus maken we een tijdelijk csv-bestand en benoemen het met de conventie <batch_id>.csv. De reden dat we hier de batch_id gebruiken is eenvoudigweg om ervoor te zorgen dat eventuele parallelle processen die worden uitgevoerd als gevolg van het ontvangen van meerdere webhook-payloads elkaar niet storen, omdat elke webhook-batch een unieke batch_id heeft.  

Zodra de gegevens volledig naar CSV zijn geconverteerd, lezen we de CSV-gegevens als een bytestroom, verwijderen het tijdelijke bestand en slaan de CSV-gegevens op als een nieuw bestand op S3. Het is belangrijk op te merken dat een andere S3 bucket nodig is voor de uitvoer, anders lopen we het risico een recursieve lus te creëren die kan resulteren in verhoogd lambda-gebruik en verhoogde kosten. We moeten identificeren in welke S3 bucket en locatie we willen dat ons CSV-bestand wordt opgeslagen binnen onze lambda-functie. Volg dezelfde procedure als hierboven om een nieuwe S3 bucket te maken om ons CSV-bestand op te slaan.

Merk op dat de tmp-directory beperkt is tot 512 MB ruimte, dus is het belangrijk dat het tijdelijke bestand daarna wordt verwijderd om voldoende ruimte voor toekomstige uitvoeringen te garanderen. De reden dat we een tijdelijk bestand gebruiken in plaats van direct naar S3 te schrijven, is om de verbinding met S3 te vereenvoudigen door slechts één verzoek te hebben.

Net als bij de consume-lambda-functie, moet u mogelijk de permissies voor uw process-lambda-functie bijwerken. Deze lambda-functie vereist dat de uitvoeringsrol GetObject-permissies heeft voor de invoer S3 bucket, en zowel PutObject als GetObject voor de uitvoer S3 bucket.

Een voorbeeld van onze verwerkingslambda-functie is te vinden hier.

Configureer een Lambda om te Worden Uitgevoerd Wanneer Nieuwe Gegevens op S3 Worden Opgeslagen

Nu onze lambda-functie om het bestand van JSON naar CSV-indeling te converteren is gecreëerd, moeten we het configureren om geactiveerd te worden wanneer een nieuw bestand op onze S3 bucket wordt aangemaakt. Om dit te doen, moeten we een trigger toevoegen aan onze lambda-functie door onze lambda-functie te openen en op “Add Trigger” aan de bovenkant van de pagina te klikken. Selecteer “S3” en geef de naam van de S3 bucket op waar de ruwe webhook-payloads worden opgeslagen. U heeft ook de optie om een bestandsvoorvoegsel en/of -achtervoegsel op te geven om op te filteren. Zodra de instellingen zijn geconfigureerd, kunt u de trigger toevoegen door onderaan op “Add” te klikken. Nu zal uw verwerkingslambda-functie worden uitgevoerd wanneer een nieuw bestand aan uw S3 bucket wordt toegevoegd.

Het Laden van de Gegevens in een Database

In dit voorbeeld zal ik het laden van de gegevens in een database niet in detail behandelen, maar als u met dit voorbeeld bent meegelezen, heeft u een paar opties:

  1. Laad de gegevens rechtstreeks in uw database binnen uw verwerkingslambda-functie

  2. Consumeer uw CSV-bestand met behulp van een vastgesteld ETL-proces

Of u nu een AWS-databaseservice gebruikt, zoals RDS of DynamoDB, of u heeft uw eigen PostgreSQL-database (of een vergelijkbare), u kunt rechtstreeks vanaf uw proceslambda-functie verbinding maken met uw databaseservice. Bijvoorbeeld, op dezelfde manier waarop we de S3-service hebben aangeroepen met behulp van “boto3” in onze lambda-functie, kunt u ook “boto3” gebruiken om RDS of DynamoDB aan te roepen. De AWS Athena service kan ook worden gebruikt om de gegevensbestanden rechtstreeks te lezen van de platte bestanden, en toegang te krijgen tot de gegevens met behulp van een querytaal die vergelijkbaar is met SQL. Ik raad aan de respectieve documentatie van de service die u gebruikt te raadplegen voor meer informatie over de beste manier om dit binnen uw omgeving te realiseren.

Evenzo zijn er veel services beschikbaar die kunnen helpen om CSV-bestanden te consumeren en de gegevens in een database te laden. U heeft mogelijk al een gevestigd ETL-proces dat u kunt gebruiken.

We hopen dat u deze gids nuttig vond – veel succes met verzenden!

Afhankelijk van het beoogde doel voor het opslaan van de Bird evenementgegevens, kunnen uw vereisten worden voldaan door simpelweg de JSON-payload als een platte bestand op te slaan. U kunt ook al een downstream ETL-proces hebben ingesteld dat in staat is om gegevens in een JSON-indeling te consumeren en te laden. In beide gevallen kunt u mogelijk het platte bestand gebruiken dat door onze verwerkingslambda die we hierboven hebben gemaakt, is gecreëerd.

Alternatief kan het nodig zijn om de gegevens te transformeren – zoals om te zetten van een JSON naar een CSV-indeling – of de gegevens direct in een database te laden. In dit voorbeeld zullen we een eenvoudige lambda-functie maken die de webhookgegevens van het originele JSON-formaat naar een CSV-bestand zal converteren dat in een database kan worden geladen. 

Creëer een Lambda om de Gegevens te Verwerken

Net als bij de lambda-functie om de webhookgegevens te consumeren, moeten we een nieuwe lambda-functie creëren door naar de Lambda-service binnen AWS te navigeren en op “Create Function” te drukken. Deze nieuwe lambda-functie wordt geactiveerd wanneer een nieuw bestand op onze S3 bucket wordt aangemaakt – het zal de gegevens lezen en omzetten in een nieuw csv-bestand.  

De lambda-functie accepteert de bestandsinformatie als een evenement. In de voorbeeld lambda-functie ziet u dat we eerst een reeks validatiecontroles hebben om ervoor te zorgen dat de gegevens compleet en geformatteerd zijn zoals verwacht. Vervolgens zetten we de JSON-payload om in een CSV-bestand met behulp van de “csv” bibliotheek en schrijven naar een tijdelijk bestand. Lambda-functies kunnen alleen lokale bestanden naar de “/tmp” directory schrijven, dus maken we een tijdelijk csv-bestand en benoemen het met de conventie <batch_id>.csv. De reden dat we hier de batch_id gebruiken is eenvoudigweg om ervoor te zorgen dat eventuele parallelle processen die worden uitgevoerd als gevolg van het ontvangen van meerdere webhook-payloads elkaar niet storen, omdat elke webhook-batch een unieke batch_id heeft.  

Zodra de gegevens volledig naar CSV zijn geconverteerd, lezen we de CSV-gegevens als een bytestroom, verwijderen het tijdelijke bestand en slaan de CSV-gegevens op als een nieuw bestand op S3. Het is belangrijk op te merken dat een andere S3 bucket nodig is voor de uitvoer, anders lopen we het risico een recursieve lus te creëren die kan resulteren in verhoogd lambda-gebruik en verhoogde kosten. We moeten identificeren in welke S3 bucket en locatie we willen dat ons CSV-bestand wordt opgeslagen binnen onze lambda-functie. Volg dezelfde procedure als hierboven om een nieuwe S3 bucket te maken om ons CSV-bestand op te slaan.

Merk op dat de tmp-directory beperkt is tot 512 MB ruimte, dus is het belangrijk dat het tijdelijke bestand daarna wordt verwijderd om voldoende ruimte voor toekomstige uitvoeringen te garanderen. De reden dat we een tijdelijk bestand gebruiken in plaats van direct naar S3 te schrijven, is om de verbinding met S3 te vereenvoudigen door slechts één verzoek te hebben.

Net als bij de consume-lambda-functie, moet u mogelijk de permissies voor uw process-lambda-functie bijwerken. Deze lambda-functie vereist dat de uitvoeringsrol GetObject-permissies heeft voor de invoer S3 bucket, en zowel PutObject als GetObject voor de uitvoer S3 bucket.

Een voorbeeld van onze verwerkingslambda-functie is te vinden hier.

Configureer een Lambda om te Worden Uitgevoerd Wanneer Nieuwe Gegevens op S3 Worden Opgeslagen

Nu onze lambda-functie om het bestand van JSON naar CSV-indeling te converteren is gecreëerd, moeten we het configureren om geactiveerd te worden wanneer een nieuw bestand op onze S3 bucket wordt aangemaakt. Om dit te doen, moeten we een trigger toevoegen aan onze lambda-functie door onze lambda-functie te openen en op “Add Trigger” aan de bovenkant van de pagina te klikken. Selecteer “S3” en geef de naam van de S3 bucket op waar de ruwe webhook-payloads worden opgeslagen. U heeft ook de optie om een bestandsvoorvoegsel en/of -achtervoegsel op te geven om op te filteren. Zodra de instellingen zijn geconfigureerd, kunt u de trigger toevoegen door onderaan op “Add” te klikken. Nu zal uw verwerkingslambda-functie worden uitgevoerd wanneer een nieuw bestand aan uw S3 bucket wordt toegevoegd.

Het Laden van de Gegevens in een Database

In dit voorbeeld zal ik het laden van de gegevens in een database niet in detail behandelen, maar als u met dit voorbeeld bent meegelezen, heeft u een paar opties:

  1. Laad de gegevens rechtstreeks in uw database binnen uw verwerkingslambda-functie

  2. Consumeer uw CSV-bestand met behulp van een vastgesteld ETL-proces

Of u nu een AWS-databaseservice gebruikt, zoals RDS of DynamoDB, of u heeft uw eigen PostgreSQL-database (of een vergelijkbare), u kunt rechtstreeks vanaf uw proceslambda-functie verbinding maken met uw databaseservice. Bijvoorbeeld, op dezelfde manier waarop we de S3-service hebben aangeroepen met behulp van “boto3” in onze lambda-functie, kunt u ook “boto3” gebruiken om RDS of DynamoDB aan te roepen. De AWS Athena service kan ook worden gebruikt om de gegevensbestanden rechtstreeks te lezen van de platte bestanden, en toegang te krijgen tot de gegevens met behulp van een querytaal die vergelijkbaar is met SQL. Ik raad aan de respectieve documentatie van de service die u gebruikt te raadplegen voor meer informatie over de beste manier om dit binnen uw omgeving te realiseren.

Evenzo zijn er veel services beschikbaar die kunnen helpen om CSV-bestanden te consumeren en de gegevens in een database te laden. U heeft mogelijk al een gevestigd ETL-proces dat u kunt gebruiken.

We hopen dat u deze gids nuttig vond – veel succes met verzenden!

Laten we je in contact brengen met een Bird-expert.
Bekijk de volledige kracht van de Bird in 30 minuten.

Door te verzenden, ga je ermee akkoord dat Bird contact met je mag opnemen over onze producten en diensten.

U kunt zich op elk moment afmelden. Zie Bird's Privacyverklaring voor details over gegevensverwerking.

Nieuwsbrief

Blijf op de hoogte met Bird via wekelijkse updates in je inbox.

Laten we je in contact brengen met een Bird-expert.
Bekijk de volledige kracht van de Bird in 30 minuten.

Door te verzenden, ga je ermee akkoord dat Bird contact met je mag opnemen over onze producten en diensten.

U kunt zich op elk moment afmelden. Zie Bird's Privacyverklaring voor details over gegevensverwerking.

Nieuwsbrief

Blijf op de hoogte met Bird via wekelijkse updates in je inbox.

Laten we je in contact brengen met een Bird-expert.
Bekijk de volledige kracht van de Bird in 30 minuten.

Door te verzenden, ga je ermee akkoord dat Bird contact met je mag opnemen over onze producten en diensten.

U kunt zich op elk moment afmelden. Zie Bird's Privacyverklaring voor details over gegevensverwerking.

R

Bereik

G

Grow

M

Manage

A

Automate

Nieuwsbrief

Blijf op de hoogte met Bird via wekelijkse updates in je inbox.