AutoMate Technisch Help

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

env.webapi.fetch

Cloudflare tunnel

VNet-intern

Cloudflare Worker\nenv.webapi.fetch(...)

Workers VPC\nService: webapi\nID: 019eb803-a076-74b1-9c53-43e99a4bf0e9

cloudflared Container App\nP-Automate-Conn-CFTunnel-CA-Weu\n2 replicas

Private Endpoint\nAzure VNet-intern

Azure App Service\np-automate-portal-webapi-webapp-weu\n(public network access: disabled)

De VPC Service binding

In wrangler.jsonc is de binding geconfigureerd:

"vpc_services": [ { "binding": "webapi", "service_id": "019eb803-a076-74b1-9c53-43e99a4bf0e9" } ]

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:

env.webapi.fetch(new Request(url, { headers }));

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

P-Automate-Conn-CFTunnel-CA-Weu

Image

docker.io/cloudflare/cloudflared:latest

Replica's

2 (min en max) — beschikbaarheidsgarantie

Ingress

Geen (outbound tunnel only)

Netwerk

VNet-intern, CAE met publicNetworkAccess: 'Disabled'

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:

// CORRECT const url = `https://p-automate-portal-webapi-webapp-weu.azurewebsites.net${path}`; // FOUT — App Service weet niet voor welke site het request bestemd is const url = `https://internal-placeholder${path}`;

Er zijn twee redenen waarom de volledige Azure-hostname verplicht is:

  1. Host-header-routing: Azure App Service met meerdere sites (of staging slots) routeert inkomend verkeer op basis van de Host HTTP-header. Als de hostname ontbreekt of onjuist is, stuurt App Service het request naar de verkeerde site of weigert het.

  2. 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

infraSubnetId

Subnet gedelegeerd aan Microsoft.App/environments (snet-cftunnel-out)

tunnelTokenSecretName

Naam van het Key Vault-secret met het tunnel-token (default: CFTunnelToken)

userAssignedIdentityId

Managed Identity met Key Vault get-rechten op secrets

logAnalyticsWorkspaceId

Log Analytics Workspace voor container-logs

Zie Cloudflare Tunnel Architectuur voor de bredere tunnelarchitectuur.

Last modified: 25 June 2026