← keuze

Cloud infrastructure

Serverless

Je app gaat viraal op TikTok.
Van 10 naar 100.000 gebruikers in één uur.

Wat gebeurt er met je ene VM?  En wie betaalt de 20 VM's die je voor de zekerheid klaarzet… als de hype voorbij is?

Leerdoelen

Na deze les kan je:

  • uitleggen wat serverless is en hoe het verschilt van IaaS, containers en PaaS
  • een event-driven architectuur beschrijven en queue, pub/sub, event bus en stream onderscheiden
  • de belangrijkste serverless bouwstenen bij AWS, GCP en Azure benoemen
  • beperkingen zoals cold starts, limieten en vendor lock-in inschatten
  • een kostenraming maken en beargumenteren wanneer serverless (niet) past
  • een eenvoudige serverless architectuur ontwerpen

Wie beheert wat?

On-premisesIaaS (VM)CaaS (containers)PaaSServerless
Hardware & netwerkjijproviderproviderproviderprovider
Virtualisatiejijproviderproviderproviderprovider
OS & patchesjijjijgedeeldproviderprovider
Runtime / container imagejijjijjijproviderprovider
Schalen & capaciteitjijjijgedeeldgedeeldprovider
Code, data & IAM-configuratiejijjijjijjijjij
Je betaalt per…aankoopuuruur / vCPUplan / uurrequest & ms

Hoe verder naar rechts, hoe minder je beheert. Code, data en configuratie blijven altijd jouw verantwoordelijkheid.

Gebaseerd op: blog.james.rcpt.to – Evolution of compute: physical to serverless

Definitie

Serverless computing refers to the concept of building and running applications that do not require server management. […] Applications are executed, scaled, and billed in response to the exact demand needed at the moment.
  • "Serverless" is een misnomer: er zijn wel servers, alleen beheer jij ze niet.
  • Geen capacity planning, patching, fault tolerance of schalen van VM's of containers.
  • Stateless: een instance kan elk moment verdwijnen, dus state bewaar je extern (database, storage).
  • Scale to zero: geen gebruik = geen draaiende resources.
  • Pay per use: je betaalt voor wat je effectief verbruikt.
Bron: CNCF Serverless Whitepaper · Wikipedia – Serverless computing

Serverless is meer dan functions

FaaS: Functions as a Service

  • Jij schrijft code, de provider voert ze uit bij een event
  • Lambda, Cloud Run functions, Azure Functions
  • Ook: serverless containers (Cloud Run, Container Apps)

BaaS: Backend as a Service

  • Volledig beheerde diensten die je via een API gebruikt
  • Storage, databases, queues, auth, data warehouse, AI-modellen
  • Bv. S3, Firestore, Pub/Sub, BigQuery

Een serverless architectuur = FaaS als lijm tussen BaaS-bouwstenen, verbonden door events

Deel 1

Event-driven architecture

Event-driven architecture

Producers Event broker Consumers Webshop "order geplaatst" IoT-sensor "temperatuur gemeten" topic: orders topic: metingen publish publish Facturatie Voorraad Bevestigingsmail Dashboard subscribe

De bouwstenen

  • Event: een feit dat gebeurd is ("order 123 geplaatst"). Onveranderlijk, in de verleden tijd.
  • Event producer: publiceert events zonder te weten wie ze ontvangt.
  • Event broker: ontvangt, buffert en routeert events (queue, topic, bus of stream).
  • Event consumer: abonneert zich op events en reageert erop, vaak een serverless function.
  • Services communiceren indirect en asynchroon: loose coupling.

Voordelen en nadelen

Voordelen

  • Loose coupling: diensten onafhankelijk aanpassen en deployen
  • Schaalbaarheid: elke consumer schaalt apart
  • Fault tolerance: broker buffert als een consumer uitvalt
  • Asynchroon: gebruiker hoeft niet te wachten

Nadelen

  • Eventual consistency: data is niet overal meteen up-to-date
  • Debuggen is moeilijker: waar is mijn event gebleven?
  • Dubbele of ongeordende berichten
  • Overzicht van de flow raakt snel zoek

Queue, pub/sub, event bus of stream?

TypeGedragAWSGCPAzure
Queue1 bericht → 1 consumer: werk verdelenSQSCloud TasksStorage Queues, Service Bus queues
Pub/sub (topic)1 bericht → alle subscribers: fan-outSNSPub/SubService Bus topics
Event bus / routerrouteert events op basis van regels en filtersEventBridgeEventarcEvent Grid
Streamgeordende log, herleesbaar, hoge throughputKinesis, MSK ServerlessManaged Kafka, Pub/Sub (ordering keys)Event Hubs

In de praktijk combineer je ze, bv. EventBridge → SQS → Lambda.

Voorbeeld: multi-tenant SaaS

Voorbeeld use case: SaaS app via EventBridge en SQS naar Lambda per tenant

Berichten komen (minstens) één keer aan

  • De meeste brokers garanderen at-least-once delivery: duplicaten zijn normaal.
  • Maak consumers dus idempotent: twee keer verwerken = hetzelfde resultaat.
  • Volgorde is niet gegarandeerd, tenzij je FIFO of ordering keys gebruikt.
  • Mislukt het na X retries? Dan gaat het bericht naar een dead-letter queue (DLQ).

def handle(event):
    # al verwerkt? dan niets doen
    if processed.exists(event["id"]):
        return
    create_invoice(event["data"])
    processed.add(event["id"])
								
Vereenvoudigd: in productie gebruik je een conditionele write of transactie.

Deel 2

Serverless bouwstenen

Overzicht: wie noemt het hoe?

CategorieAWSGCPAzure
FunctionsLambdaCloud Run functionsAzure Functions
ContainersFargate (ECS/EKS)Cloud RunContainer Apps
Object storageS3Cloud StorageBlob Storage
NoSQL databaseDynamoDBFirestoreCosmos DB (serverless)
Relationele databaseAurora Serverless v2, Aurora DSQL(Spanner met autoscaling)Azure SQL Database serverless
Data warehouseRedshift Serverless, AthenaBigQueryMicrosoft Fabric
MessagingSQS, SNS, EventBridgePub/Sub, EventarcService Bus, Event Grid
OrchestrationStep FunctionsWorkflowsDurable Functions, Logic Apps
API gatewayAPI GatewayAPI Gateway, ApigeeAPI Management
SecretsSecrets ManagerSecret ManagerKey Vault

Functions

  • AWS Lambda
  • GCP Cloud Run functions
  • Azure Azure Functions

Hoe werkt het?

  1. Je schrijft een handler: een functie die één event verwerkt
  2. Je deployt code of een container image
  3. Een trigger koppelt een event aan je functie
  4. De provider start instances bij, en stopt ze als het stil is

Zo ziet een function eruit

GCP – Cloud Run functions


import functions_framework

@functions_framework.http
def hello(request):
    name = request.args.get("name", "student")
    return {"message": f"Hallo {name}!"}
								

AWS – Lambda


def lambda_handler(event, context):
    name = event.get("queryStringParameters",
                     {}).get("name", "student")
    return {"statusCode": 200,
            "body": f"Hallo {name}!"}
								

gcloud run deploy hello --source . --function hello \
    --base-image python313 --region europe-west1 --allow-unauthenticated
						

Triggers

  • HTTP: een request van een browser, app of API gateway
  • Storage: bestand opgeladen of verwijderd
  • Messaging: bericht op een queue of topic (SQS, Pub/Sub…)
  • Schedule: cron (EventBridge Scheduler, Cloud Scheduler)
  • Database changes: DynamoDB Streams, Firestore triggers, Cosmos DB change feed
CloudEvents logo

CloudEvents: open CNCF-standaard voor het beschrijven van events (GCP Eventarc, Azure Event Grid)

Een event in CloudEvents-formaat


{
  "specversion": "1.0",
  "type": "google.cloud.storage.object.v1.finalized",
  "source": "//storage.googleapis.com/projects/_/buckets/videos-raw",
  "id": "8413216547019243",
  "time": "2026-09-28T09:30:00Z",
  "datacontenttype": "application/json",
  "data": { "bucket": "videos-raw", "name": "kat-op-skateboard.mp4" }
}
						

gcloud eventarc triggers create video-uploaded \
    --location=europe-west1 \
    --destination-run-service=transcoder \
    --event-filters="type=google.cloud.storage.object.v1.finalized" \
    --event-filters="bucket=videos-raw" \
    --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com
						

Deployen: van klikken naar code

  • vroeger: zip opladen in een bucket
  • Source deploy: de provider bouwt je container
  • Container image uit een registry
  • Infrastructure as Code: Terraform, AWS SAM / CDK, Bicep
  • Via een CI/CD-pipeline, nooit met de hand in productie

resource "google_cloud_run_v2_service" "api" {
  name     = "video-api"
  location = "europe-west1"

  template {
    containers {
      image = "europe-west1-docker.pkg.dev/my-proj/apps/video-api:1.0"
    }
    scaling {
      min_instance_count = 0   # scale to zero
      max_instance_count = 10  # kostenplafond!
    }
  }
}
								

Limieten

AWS LambdaCloud Run functionsAzure Functions (Flex Consumption)
Max. uitvoeringstijd15 min60 min (HTTP)30 min standaard, configureerbaar
Max. geheugen10 GB32 GiBtot 4 GB per instance
Requests per instance1tot 1000 (standaard 80)configureerbaar
Scale to zerojajaja

Past je taak niet binnen deze grenzen? Kies dan een job (Cloud Run jobs, AWS Batch, Container Apps jobs) of een container.

Indicatieve waarden (stand 2026). Check altijd de actuele documentatie van de provider.

Cold starts

Cold instance toewijzen code laden runtime start init: imports, DB-connectie handler Warm handler instance wordt hergebruikt: enkel je code draait
  • Eerste request na een stilte = extra latency (van ~100 ms tot enkele seconden).
  • Beperken: kleine packages, lichte runtime, init buiten de handler voor hergebruik.
  • Vermijden: min instances (Cloud Run), provisioned concurrency / SnapStart (Lambda), always ready (Azure). Maar dan betaal je ook als het stil is!

API gateway: de voordeur

  • AWS API Gateway
  • GCP API Gateway, Apigee
  • Azure API Management
  • Eén publiek endpoint voor tientallen functions of services
  • Authenticatie (JWT, OAuth, API keys) vóór je code draait
  • Rate limiting en quota: bescherming tegen misbruik én tegen een onverwachte factuur
  • Routing, versioning, caching en request validatie

Workflows: choreography vs. orchestration

Choreography

  • Services reageren op elkaars events
  • Geen centrale regisseur: zeer los gekoppeld
  • Nadeel: de volledige flow zie je nergens

Orchestration

  • Een workflow engine roept de stappen op in volgorde
  • Retries, timeouts, parallelle stappen en wachten op een mens
  • Step Functions, GCP Workflows, Durable Functions, Logic Apps

Vuistregel: choreography tussen domeinen, orchestration voor een proces binnen één domein (bv. bestelling → betaling → verzending).

Serverless databases

NoSQL

  • AWS DynamoDB (on-demand)
  • GCP Firestore
  • Azure Cosmos DB (serverless)

Relationeel

  • AWS Aurora Serverless v2 (kan naar 0), Aurora DSQL
  • GCP geen echte scale-to-zero SQL; Spanner met autoscaling
  • Azure Azure SQL Database serverless (auto-pause)
  • Betalen per request / opslag in plaats van per server-uur
  • Let op: een "wakker wordende" database geeft ook een cold start
  • Duizenden function-instances × een DB-connectie = connection storm. Gebruik een proxy of HTTP-API.

Data warehousing

  • AWS Redshift Serverless, Athena
  • GCP BigQuery
  • Azure Microsoft Fabric

Betalen per gescande data of per verbruikte compute

Demo: BigQuery

Data warehouse: data sources, staging area, warehouse, data marts en users

Object storage

  • AWS S3
  • GCP Cloud Storage
  • Azure Blob Storage

Oneindig schaalbaar, betalen per GB, per request en voor egress. Vaak de bron van events.

Demo: GCP bucket

Vergelijking van hot, cool en archive storage tiers

Serverless containers

  • AWS Fargate (ECS/EKS), Lambda met container images
  • GCP Cloud Run (services en jobs)
  • Azure Container Apps (services en jobs)
  • Elke taal, elke library, elk binair bestand: als het in een container past, draait het
  • Geen lock-in op het programmeermodel: dezelfde image draait ook op Kubernetes
  • Let op: Fargate = geen servers beheren, maar geen scale to zero. Serverless is een spectrum.

Demo: Cloud Run

  • Scale from 0 (!) tot honderden instances; stel zelf een max in
  • Tot 1000 gelijktijdige requests per instance
  • Snelle start (meestal < enkele seconden); min instances tegen cold starts
  • Elke deploy = nieuwe revision: traffic splitting voor canary en blue/green
  • Tot 8 vCPU / 32 GiB per instance, en optioneel GPU's voor AI-inferencing
  • Ingebouwde HTTPS-URL, TLS-certificaten en custom domains
  • Isolatie via sandbox: gVisor (1e generatie) of microVM (2e generatie)

Demo!

Security in serverless

  • Least privilege: elke function krijgt een eigen service account / role, met enkel de rechten die ze nodig heeft
  • Secrets nooit in code of environment variables in Git, wel in Secrets Manager, Secret Manager of Key Vault
  • Event injection: ook een event uit een bucket of queue is onbetrouwbare input, dus valideer alles
  • Dependencies: je hebt geen OS meer om te patchen, maar wel libraries (supply chain)
  • Denial of wallet: een aanvaller hoeft je niet plat te leggen, hij kan je gewoon laten betalen. Gebruik rate limits, max instances en budget alerts.

Observability

  • Je kan niet meer inloggen op "de server". Alles moet uit logs, metrics en traces komen.
  • Structured logging (JSON) met een correlation-ID per request of event
  • Distributed tracing volgt één request doorheen functions, queues en databases
  • Standaard: OpenTelemetry, werkt bij alle providers
  • AWS CloudWatch, X-Ray
  • GCP Cloud Logging, Cloud Trace
  • Azure Azure Monitor, Application Insights

Voorbeeld: microservices op AWS

AWS architectuur met API Gateway, Lambda microservices, DynamoDB en EventBridge

Voorbeeld: web app op Azure

Referentiearchitectuur voor een serverless web applicatie op Azure

Voorbeeld: parkeerdata Gent op GCP

Serverless architectuur op Google Cloud: Cloud Scheduler triggert via Pub/Sub een Cloud Run function die open data van Stad Gent ophaalt en in BigQuery bewaart; een Cloud Run web app toont de statistieken

Deel 3

Kosten & trade-offs

Hoe betaal je voor een function?

kost = #requests × prijs per request
+ uitvoeringstijd × geheugen (GB-seconden) × prijs per GB-s

  • Voorbeeld Lambda (x86, us-east-1): $0,20 per miljoen requests en $0,0000166667 per GB-s
  • Maandelijkse free tier: 1 miljoen requests en 400.000 GB-s
  • Meer geheugen = ook meer CPU, dus soms sneller én goedkoper
Prijzen indicatief. Gebruik de pricing calculator van de provider.

Rekenvoorbeeld

API-function: 512 MB geheugen, 200 ms per request

ScenarioRequests / maandGB-secondenLambdaKleine VM('s), 24/7
Schoolproject / interne tool5 miljoen500.000≈ $2,50 (na free tier)≈ $15
Constant 100 req/s259 miljoen25,9 miljoen≈ $480≈ $60–120
  • Weinig of grillig verkeer: serverless wint ruim.
  • Constant hoog verkeer: een VM, container of Cloud Run met concurrency is goedkoper.
  • Vergeet de TCO niet: wie patcht, monitort en schaalt die VM's? Engineeringuren kosten ook geld.

Verborgen kosten

  • API Gateway: per miljoen requests, soms duurder dan de function zelf
  • Data transfer / egress: data die de cloud verlaat (video's!)
  • Logging: elke log-regel van miljoenen invocations wordt opgeslagen en gefactureerd
  • NAT gateways en private networking
  • Recursieve loops: een function die schrijft in de bucket die haar triggert…

Zet altijd budget alerts en max instances!

Wanneer wel, wanneer niet?

Serverless past goed bij

  • Onvoorspelbaar of piekerig verkeer
  • Event-driven verwerking (uploads, berichten, IoT)
  • Geplande taken, lijm tussen diensten
  • Prototypes, startups, kleine teams
  • Web-API's en backends voor apps

Eerder niet bij

  • Langlopende of zware rekenjobs
  • Constant hoge, voorspelbare load
  • Heel lage, stabiele latency (cold starts)
  • Langdurige verbindingen, veel lokale state
  • Strikte portabiliteitseisen (lock-in)

Case: Prime Video (2023)

  • Een tool die de kwaliteit van videostreams monitort, gebouwd met Step Functions en Lambda
  • Probleem: per seconde video tientallen state transitions en veel data via S3 tussen de stappen. Dat was duur en schaalde slecht.
  • Oplossing: alles samengevoegd in één proces in containers (ECS)
  • Resultaat: 90% goedkoper

Les: niet "serverless is slecht", maar kies per workload het juiste model

Bron: Prime Video Tech blog – "Scaling up the Prime Video audio/video monitoring service and reducing costs by 90%" (2023)

Vendor lock-in

  • Het risico zit niet in de function, maar in de bouwstenen eromheen: triggers, IAM, DynamoDB, Step Functions…
  • Beperken:
    • Containers (Cloud Run, Container Apps) in plaats van provider-specifieke function-formaten
    • Open standaarden: CloudEvents, OpenTelemetry, Kafka-API
    • Open-source platformen: Knative, OpenFaaS, KEDA op eigen Kubernetes
    • Hexagonale architectuur: businesslogica los van de handler
  • Maar: lock-in is een afweging, geen doodzonde. Snelheid van ontwikkelen heeft ook waarde.

Quiz: serverless of niet?

Thumbnail maken bij elke foto-upload ja event-driven, piekerig
Multiplayer game-server met duizenden WebSockets, 24/7 eerder niet constante load, lange verbindingen
Inschrijvingsformulier van een school, piek in augustus ja quasi nul verkeer buiten de piek
Een AI-model 3 dagen trainen op GPU's geen function wel een managed batch- of trainingsjob
Nachtelijk rapport dat 5 minuten draait ja scheduler + function of job
Legacy ERP dat een Windows-server met lokale bestanden verwacht nee lift & shift naar een VM

Deel 4

Case study

Case study: videoplatform

Opdracht: ontwerp een basic YouTube-alternatief, volledig serverless.

Features

  • Video upload
  • Video-preprocessing (transcoding, thumbnails)
  • Persoonlijk profiel met opgeladen video's, views per video…
  • Datalake voor suggesties (AI)

Eigenschappen

  • Fault-tolerant en schaalbaar

Lever op (in groep)

  1. Architectuurdiagram
  2. Keuze van diensten bij één provider
  3. Welke events, welke triggers?
  4. Ruwe kostenraming
  5. Top 3 risico's

Denkvragen

  • Een video van 2 GB: moet die door je function? (payload limits!)
  • Wat start de preprocessing, en wie weet wanneer die klaar is?
  • Transcoderen duurt 20 minuten. Past dat in een function?
  • Views tellen = extreem veel kleine writes. Welke database?
  • Hoe krijg je data in het datalake zonder de app te vertragen?
  • Wat kost het als één video viraal gaat? (egress!)

Referentie-oplossing

Client (web/app) API gateway + auth API-function profiel, views, signed URL NoSQL database metadata & views Bucket: raw originele uploads upload via signed URL Event router object.finalized Transcoding managed service / job Bucket: processed HLS, thumbnails status "klaar" CDN streaming & caching kijken Topic view-/like-events Datalake / DWH analyse AI-aanbevelingen model / batch

Referentie-oplossing per provider

OnderdeelAWSGCPAzure
AuthCognitoIdentity Platform / Firebase AuthEntra External ID
APIAPI Gateway + LambdaAPI Gateway + Cloud RunAPI Management + Functions
Upload & opslagS3 + presigned URLCloud Storage + signed URLBlob Storage + SAS token
Upload-eventS3 → EventBridgeEventarcEvent Grid
TranscodingMediaConvertTranscoder API / Cloud Run jobContainer Apps job (FFmpeg)
Metadata & viewsDynamoDBFirestoreCosmos DB
DistributieCloudFrontCloud CDNFront Door
Events → datalakeData Firehose → S3 + AthenaPub/Sub → BigQueryEvent Hubs → Fabric
AanbevelingenPersonalize / SageMakerVertex AIAzure Machine Learning

Wat kan er misgaan?

  • Dubbel event → video twee keer getranscodeerd: maak de job idempotent
  • Transcoding faalt → retries + dead-letter queue + status "mislukt" voor de gebruiker
  • Output in de input-bucket → oneindige lus en een astronomische factuur
  • Virale video → CDN vangt de load op; zonder CDN betaal je de volle egress
  • Hot partition: één video met miljoenen views in één database-record → tellers bufferen of sharden
  • Misbruik → upload-limieten, quota per gebruiker, rate limiting, budget alerts

Trends

  • Serverless AI: modellen aanroepen via een API (Amazon Bedrock, Vertex AI, Microsoft Foundry), en GPU's op Cloud Run / Container Apps voor eigen modellen
  • Edge functions: code draait in honderden locaties dicht bij de gebruiker (Cloudflare Workers, CloudFront Functions, Lambda@Edge)
  • WebAssembly: lichte sandboxes met cold starts in microseconden
  • Scale-to-zero databases: Aurora Serverless v2, Aurora DSQL, Neon
  • Durable execution: workflows als gewone code (Durable Functions, Temporal)
  • Steeds meer diensten worden serverless: logging-analyse, security (IDS), ML-pipelines, Kafka…

Samenvatting

Je wint

  • Geen serverbeheer
  • Automatisch schalen, ook naar nul
  • Betalen per gebruik
  • Snel bouwen met beheerde bouwstenen

Je betaalt met

  • Cold starts en limieten
  • Complexere debugging en observability
  • Vendor lock-in
  • Duur bij constant hoge load

Serverless is geen doel, maar een keuze per workload

Verder lezen

Volgende stap: aan de slag in het labo!