Na virtualisatie via docker containers naar microservices lijkt serverless computing een eindpunt. Serverless klinkt abstract en daarom is het lastig om te vatten wat er nu zo belangrijk aan is. Laatst kregen wij een verzoek waarbij ik direct inzag dat serverless hier een mooie oplossing voor zou zijn.
De klantwens was om de mensen die de praktijkcursus gevolgd hebben op een groepsfoto te zetten samen met een embleem om hiermee nieuwe bezoekers te verwelkomen op een fotomuur om hiermee social proof te leveren.
Een standaard applicatie hiervoor kon ik niet vinden en vaak komt er van alles bij kijken. Data opslag, applicatiebeheer, beheer van een (deel van) een server en waarom zou je een server aan moeten houden als er in de nacht geen behoefte aan is?
Technische beschrijving
Hier volgt een wat technische beschrijving die hopelijk voor niet techneuten ook goed te volgen is. De basis is een S3 bucket van Amazon Web Services (AWS). Dat is in feite een oneindige data opslag waarbij ieder object een link heeft om dat object aan te roepen. Dit kunnen foto’s zijn, maar ook html-bestanden. Door een instelling van de S3 bucket kan deze ook direct als een statische website dienen. Statisch betekent dat er geen code op een server wordt uitgevoerd, maar dat de pagina gewoon zonder aanpassingen geserveerd wordt aan een browser en eventuele Javascript-code op het device van de gebruiker wordt uitgevoerd. Deze S3 bucket gebruik ik voor de opslag van de foto’s en voor het aanbieden van de internetpagina waarop de foto’s willekeurig getoond zullen worden aan het publiek.
Maar hoe zorgen we ervoor dat er willekeurige foto’s getoond worden op een statische html-pagina? Zoals gezegd kan er wel javascript op de browser zelf uitgevoerd worden. Deze kijkt naar een json-bestand in dezelfde S3 bucket waarin staat welke foto’s getoond moeten worden. Json is net als xml een manier om structuur aan data te geven. Iedere twee minuten haalt Javascript het json-bestand op om de foto’s te tonen. De crux zit hem dus in om steeds dat json-bestand aan te passen met andere foto’s. Hiervoor is iets nodig dat code uitvoert en normaliter is dat een virtuele server of container. In ons geval gebruiken we een andere dienst van AWS namelijk Lambda. In Lambda kun je scripts uploaden die afgaan als er een bepaalde gebeurtenis plaatsvind. Bijvoorbeeld als er een bestand geüpload wordt naar een S3 bucket of als er een bericht wordt ingeschoten naar een AWS Simple Notification Service (SNS) topic, een andere dienst van AWS. Zo’n bericht kan bijvoorbeeld afgevuurd worden door Javascript in een browser. Lambda past dus iedere keer het json-bestand aan wat door de javascript op de pagina gebruikt wordt om willekeurig foto’s op te halen.
Hiervoor is dus geen enkele server nodig en de maandelijkse kosten hiervoor liggen nog onder de euro. Door er nog wat alarmen op te plaatsen, bijvoorbeeld als er een fout optreedt of de pagina niet goed opbouwt is ook het beheer in de basis geregeld.
Nu bleef er nog één uitdaging over, de foto’s van het de camera in een S3 bucket uploaden. Dit valt eigenlijk buiten de scope, maar hiervoor heb ik zelf een console scriptje geschreven dat op de computer draait die gebruikt wordt om de foto’s van de camera af te krijgen. Deze kijkt iedere keer of er foto’s bestaan in de Afbeeldingen-map en upload deze automatisch en verwijderd deze daarna. Als er meer dan zeven dagen geen nieuwe foto’s in de S3 bucket zijn bijgekomen gaat hier ook nog een alarm van af.
Krachtige oplossing
De gemaakte oplossing is krachtig, vereist nagenoeg geen beheer en je betaalt alleen voor noodzakelijke kosten die bovendien minimaal zijn. Een Lambda script, SQS Queue en S3 bucket moeten voor beheer gewoon als configuratie-items behandeld worden.
Dit is slechts een beperkt voorbeeld maar wel een echt praktijkvoorbeeld en zo kan ik er nog wel een paar geven. Ik besef me overigens dat serverless niet per se een vervanging is voor virtuele servers, het zijn gewoon verschillende dingen. Serverless is ook geen silver bullet die bijvoorbeeld virtuele servers overbodig maakt, zie het meer als nog een tool in het arsenaal om dingen eenvoudiger te doen.
Ik reageer altijd op reacties, hopelijk kan ik je inspireren om het ook toe te passen. Ik heb ook een case voor Docker Containers, bij voldoende interesse zal ik deze ook schrijven.