StatusPage — Workers VPC en CFTunnel
De StatusPage Worker communiceert met AutoMate.API uitsluitend via een Workers VPC Service binding. Er is geen publieke route; het verkeer loopt via een cloudflared Container App in de Azure VNet.
Architectuur
De VPC Service binding
In wrangler.jsonc is de binding geconfigureerd:
De webapi binding is geen gewone Worker-to-Worker Service binding, maar een VPC Service binding die routeert via een geregistreerde Cloudflare Tunnel. De binding is aangemaakt in het Cloudflare-dashboard (niet automatisch via Wrangler); de wrangler.jsonc-configuratie zorgt dat de binding bij een wrangler deploy niet verwijderd wordt.
In de Worker-code is de binding beschikbaar als env.webapi — een Fetcher-object. Aanroepen verlopen als:
De cloudflared Container App
De CFTunnel is een Azure Container App (Microsoft.App/containerApps) die de cloudflare/cloudflared:latest image draait. De configuratie staat in Infrastructure/Src/Modules/MainComponents/CFTunnel.bicep.
Relevante eigenschappen:
Eigenschap | Waarde |
|---|---|
Naam |
|
Image |
|
Replica's | 2 (min en max) — beschikbaarheidsgarantie |
Ingress | Geen (outbound tunnel only) |
Netwerk | VNet-intern, CAE met |
Tunnel token | Uit Azure Key Vault (KV-secret referentie via Managed Identity) |
De container draait cloudflared tunnel run met het tunnel-token uit Key Vault. Het token koppelt de Container App aan de Cloudflare Tunnel in het Cloudflare-dashboard.
Waarom de echte Azure-hostname verplicht is
Bij het aanroepen via env.webapi.fetch(...) is de URL-notatie cruciaal:
Er zijn twee redenen waarom de volledige Azure-hostname verplicht is:
Host-header-routing: Azure App Service met meerdere sites (of staging slots) routeert inkomend verkeer op basis van de
HostHTTP-header. Als de hostname ontbreekt of onjuist is, stuurt App Service het request naar de verkeerde site of weigert het.Origin TLS SNI: De cloudflared-tunnel zet TLS op tot aan de App Service. De TLS-handshake gebruikt SNI (Server Name Indication) om te bepalen welk TLS-certificaat gepresenteerd wordt. App Service vereist dat de SNI-naam overeenkomt met de App Service-hostname — anders mislukt de TLS-handshake.
Waarom Workers VPC boven een publieke hostname
De App Service heeft publicNetworkAccess: 'Disabled' ingesteld. Er is geen publiek bereikbaar URL.
Alternatieve opzet: een public hostname toevoegen aan de Cloudflare Tunnel en die voorzien van een Cloudflare Service Token (CF-Access-Client-Id + CF-Access-Client-Secret). Deze aanpak heeft twee nadelen:
Secrets moeten als Worker-secrets worden beheerd en worden meegestuurd in elke request
De App Service-URL blijft publiek — zelfs met Access-bescherming is dit een groter aanvalsoppervlak
De VPC Service binding routeert het verkeer volledig binnen Cloudflare's netwerk en de Azure VNet, zonder publieke URL. Het is de veiligste en architectureel schoonste oplossing voor deze use case.
Bicep-module
De CFTunnel-resources worden aangemaakt door Infrastructure/Src/Modules/MainComponents/CFTunnel.bicep. Relevante parameters:
Parameter | Beschrijving |
|---|---|
| Subnet gedelegeerd aan |
| Naam van het Key Vault-secret met het tunnel-token (default: |
| Managed Identity met Key Vault |
| Log Analytics Workspace voor container-logs |
Zie Cloudflare Tunnel Architectuur voor de bredere tunnelarchitectuur.