Azure Application Modernization Voor Nederlandse Overheidsorganisaties

đź’Ľ Management Samenvatting

Veel Nederlandse overheidsorganisaties draaien nog bedrijfskritische applicaties op verouderde on-premises infrastructuur. Azure Application Modernization biedt een gestructureerd pad om deze applicaties gecontroleerd te migreren, te moderniseren en toekomstbestendig te maken, met behoud van continuĂŻteit, beveiliging en compliance volgens de Nederlandse Baseline voor Veilige Cloud.

Aanbeveling
PLAN EN IMPLEMENTEER GESTRUCTUREERDE APPLICATION MODERNIZATION
Risico zonder
Medium
Risk Score
7/10
Implementatie
320u (tech: 200u)
Van toepassing op:
âś“ Azure App Service
âś“ Azure Kubernetes Service
âś“ Azure Functions
âś“ Azure SQL Database
âś“ Azure Storage

Verouderde applicatielandschappen brengen aanzienlijke risico’s met zich mee voor de overheid. Onderliggende infrastructuur raakt end-of-support, patches worden lastiger toepasbaar, afhankelijkheden zijn vaak slecht gedocumenteerd en ontwikkelteams zijn soms niet meer beschikbaar. Dit leidt tot kwetsbaarheden in de beveiliging, moeite om te voldoen aan BIO- en NIS2-eisen, beperkte schaalbaarheid en hoge operationele kosten. Daarnaast sluiten monolithische applicaties slecht aan op moderne eisen zoals hybride werken, API‑gebaseerde gegevensuitwisseling en geautomatiseerde continuïteitsvoorzieningen. Zonder een doordachte modernisatiestrategie ontstaan technische schulden die toekomstige veranderingen juist moeilijker en risicovoller maken. Voor Nederlandse overheidsorganisaties betekent dit een direct risico voor de continuïteit van publieke dienstverlening en het vertrouwen van burgers en ketenpartners.

PowerShell Modules Vereist
Primary API: Azure Resource Manager (ARM), Azure Migrate, Azure Policy
Connection: Connect-AzAccount
Required Modules: Az.Accounts, Az.Resources, Az.Migrate, Az.Monitor

Implementatie

Dit artikel beschrijft een praktische en toetsbare aanpak voor het moderniseren van applicaties naar Azure. We behandelen het opstellen van een applicatieportfolio en modernisatie-roadmap, het kiezen tussen rehost, refactor, rearchitect of rebuild, het inrichten van een cloud-native referentiearchitectuur op basis van Azure best practices, en het borgen van beveiliging, compliance en continuïteit. Daarnaast wordt uitgelegd hoe u Azure Migrate, Azure Policy, Azure Monitor en DevOps‑praktijken inzet om modernisatie stapsgewijs, controleerbaar en herhaalbaar uit te voeren. Het bijbehorende PowerShell‑script helpt om de huidige Azure‑omgeving te inventariseren, modernisatiekandidaten te identificeren en de voortgang van modernisatietrajecten te monitoren.

Modernisatiestrategie en Applicatieportfolio

Effectieve application modernization begint niet met techniek, maar met een realistische strategie en een goed begrip van het bestaande applicatielandschap. Nederlandse overheidsorganisaties beheren vaak tientallen tot honderden applicaties, variërend van kleine maatwerkoplossingen tot grote kernsystemen voor burgerregistratie, vergunningverlening en financiële administratie. De eerste stap is het opstellen van een actueel applicatieportfolio waarin per applicatie minimaal de functie, eigenaar, gebruikersgroep, vertrouwelijkheid van gegevens, afhankelijkheden, levenscyclus en technische staat zijn vastgelegd. Dit portfolio vormt de basis voor het bepalen van modernisatieprioriteiten. Applicaties met een hoge business‑kritikaliteit, hoge beveiligingsrisico’s of een duidelijke technische end-of-life dienen prioriteit te krijgen. Tegelijkertijd moet rekening worden gehouden met lopende projecten, contractuele verplichtingen met leveranciers en de beschikbare capaciteit in ontwikkel- en beheerteams.

Op basis van het portfolio kiest de organisatie per applicatie een passend modernisatiescenario. Veelgebruikte scenario’s zijn rehost (lift-and-shift naar Azure IaaS of PaaS), refactor (aanpassingen om gebruik te maken van PaaS‑diensten zoals App Service of Azure SQL), rearchitect (herontwerp naar een modulair of microservices‑model) en in sommige gevallen rebuild (volledige herbouw op basis van moderne architectuurprincipes). Voor overheidsorganisaties is het belangrijk om deze keuzes expliciet te documenteren, inclusief de rationale vanuit continuïteit, beveiliging en kosten. Een oud maar stabiel systeem dat alleen intern toegankelijk is, kan bijvoorbeeld volstaan met een gecontroleerde rehost, terwijl een publiek portaal met hoge beschikbaarheidseisen en gevoelige gegevens juist vraagt om een grondige refactor of rearchitect‑aanpak. Door deze beslissingen vast te leggen in een modernisatie‑roadmap, ontstaat een transparant plan waarmee bestuurders, CISO’s en lijnmanagers kunnen volgen welke risico’s wanneer worden gereduceerd.

Bij het opstellen van de modernisatiestrategie moeten governance en besluitvorming helder zijn ingericht. Dit betekent dat er een stuurgroep of portfolioboard is waarin in ieder geval de CIO, CISO, architectuur, functioneel beheer en privacy/security officers zijn vertegenwoordigd. Zij bewaken dat modernisatieprojecten niet alleen technisch aantrekkelijk zijn, maar aantoonbaar bijdragen aan beleidsdoelen zoals digitale inclusie, transparante dienstverlening en naleving van wet- en regelgeving (waaronder BIO, AVG en NIS2). Ook moeten er duidelijke criteria zijn voor het starten, stoppen of bijsturen van modernisatietrajecten. Een applicatie die tijdens de analysefase toch nauwelijks meer wordt gebruikt, kan bijvoorbeeld beter worden uitgefaseerd dan gemoderniseerd. De modernisatiestrategie is dus geen eenmalig document, maar een levend kader dat meebeweegt met ontwikkelingen in technologie, wetgeving en de behoefte van burgers en ketenpartners.

Referentiearchitectuur voor Gemoderniseerde Applicaties op Azure

Wanneer is besloten dat een applicatie naar Azure wordt gemoderniseerd, is een consistente referentiearchitectuur cruciaal. Voor Nederlandse overheidsorganisaties betekent dit dat iedere gemoderniseerde applicatie moet landen in een gecontroleerde Azure‑omgeving waarin identity, netwerk, opslag, logging en security eenduidig zijn ingericht. Identity en access management verlopen via Microsoft Entra ID, waarbij zowel medewerkers als technische accounts (service principals en managed identities) volgens het Zero Trust‑principe worden beheerd. Applicaties maken gebruik van managed identities voor toegang tot databases, opslag en andere Azure‑diensten, zodat hardcoded secrets en connection strings in broncode worden voorkomen. Netwerksegmentatie wordt gerealiseerd via Virtual Networks, subnetten en in veel gevallen private endpoints, zodat beheerinterfaces en data‑stromen niet onnodig via het publieke internet verlopen. Voor verbindingen met on‑premises infrastructuur wordt gebruikgemaakt van VPN of ExpressRoute, met duidelijke segmentatie tussen test, acceptatie en productieomgevingen.

Op applicatieniveau is het raadzaam om zoveel mogelijk gebruik te maken van PaaS‑diensten zoals Azure App Service, Azure Functions, Azure Kubernetes Service en beheerde databasediensten zoals Azure SQL of Azure Database for PostgreSQL. Deze diensten nemen een groot deel van het infrastructuurbeheer, patching en schaalbaarheidsbeheer over, waardoor ontwikkelteams zich kunnen richten op functionaliteit in plaats van op onderliggende platformtaken. Tegelijkertijd moeten configuratie‑ en deployprocessen worden geautomatiseerd via Infrastructure as Code (bijvoorbeeld Bicep, ARM‑templates of Terraform) en CI/CD‑pijplijnen. Hierdoor worden omgevingen reproduceerbaar, kunnen wijzigingen worden getest en uitgerold volgens change‑procedures, en is altijd inzichtelijk welke versie van een applicatie waar draait. Voor beveiliging is defense‑in‑depth het uitgangspunt: netwerkbeveiliging via NSG’s en Web Application Firewalls, identiteitsbeveiliging via conditional access en Privileged Identity Management, en gegevensbeveiliging via versleuteling in rust en tijdens transport, gecombineerd met dataclassificatie en DLP‑maatregelen waar relevant.

Monitoring en observability zijn onlosmakelijk onderdeel van de referentiearchitectuur. Iedere gemoderniseerde applicatie moet standaard geïntegreerd zijn met Azure Monitor, Application Insights en centrale log‑platformen zoals Log Analytics en eventueel Microsoft Sentinel. Dit omvat metrische gegevens (CPU, geheugen, response‑tijden), logbestanden (applicatielogs, auditlogs, securitylogs) en traces voor het analyseren van ketenverstoringen. Door uniforme dashboards, alerts en rapportages in te richten, kunnen beheer- en secops‑teams afwijkingen vroegtijdig detecteren, trends analyseren en incidenten sneller oplossen. Voor de Nederlandse publieke sector is het daarnaast essentieel om logging en monitoring zodanig in te richten dat zij voldoen aan wettelijke eisen voor dossiervorming, auditability en bewaartermijnen, zonder onnodig persoonsgegevens langer te bewaren dan toegestaan. Deze combinatie van technisch ontwerp en governance‑afspraken zorgt ervoor dat modernisatie naar Azure niet alleen leidt tot een modern platform, maar ook tot aantoonbaar betere beheersbaarheid en compliance.

Migratieaanpak en Fasering

Een succesvolle migratie naar een gemoderniseerde Azure‑architectuur vraagt om een gefaseerde aanpak met duidelijke quality‑gates. In de voorbereidingsfase wordt de huidige situatie in kaart gebracht: infrastructuurcomponenten, koppelingen met andere systemen, gebruikte databases, achtergrondtaken en batchprocessen, en niet‑functionele eisen zoals performance en beschikbaarheid. Tools zoals Azure Migrate kunnen worden ingezet om workloads te inventariseren en eerste inschattingen te maken van resourcegebruik en afhankelijkheden. Parallel hieraan worden functionele en technische requirements aangescherpt, inclusief beveiligingseisen, dataclassificatie, logging‑vereisten en continuïteitsdoelstellingen (RPO/RTO). Op basis hiervan wordt een target‑architectuur per applicatie vastgesteld en worden proof‑of‑concepts uitgevoerd om aannames over performance, schaalbaarheid en integratie te valideren voordat grootschalige migraties starten.

Tijdens de implementatiefase worden omgevingen stapsgewijs opgebouwd, bij voorkeur volgens een vaste volgorde: eerst de basis‑landing zone en identity‑inrichting, daarna netwerk en connectiviteit, vervolgens platformdiensten en tot slot de applicatiecode en data‑migratie. Elke stap wordt ondersteund door geautomatiseerde deployments en herhaalbare scripts, zodat omgevingen eenvoudig opnieuw kunnen worden uitgerold bij fouten of noodzakelijke ontwerpwijzigingen. Test- en acceptatieomgevingen spelen hierbij een cruciale rol: hier worden niet alleen functionele tests uitgevoerd, maar ook performance‑, beveiligings- en failovertests om te beoordelen of de moderne omgeving voldoet aan de eisen uit BIO en NEN‑normen. Alleen wanneer alle kritieke scenario’s succesvol zijn doorlopen en gedocumenteerd, wordt productie‑migratie geautoriseerd. Voor kritieke systemen is het raadzaam om een parallelle uitrol te kiezen waarbij de oude en nieuwe omgeving tijdelijk naast elkaar bestaan en verkeer geleidelijk wordt omgezet, zodat bij onvoorziene problemen snel kan worden teruggeschakeld.

Na de daadwerkelijke migratie begint de stabilisatie‑ en optimalisatiefase. In deze periode worden monitoringgegevens intensief geanalyseerd om knelpunten in performance, foutpercentages en beveiligingsalerts te identificeren. Resource‑configuraties kunnen worden aangepast om kosten te optimaliseren, bijvoorbeeld door gebruik te maken van autoscaling, reserved instances of serverless‑capaciteitsmodellen waar passend. Tegelijkertijd worden lessons learned vastgelegd voor volgende migratiegolven, zodat herhaalbare patronen en standaardcomponenten ontstaan. Voor de Nederlandse overheid is het belangrijk dat deze fase niet wordt overgeslagen: pas na enkele weken of maanden productie‑ervaring blijkt vaak of de modernisatie daadwerkelijk leidt tot hogere betrouwbaarheid, betere beveiliging en lagere beheerlast. De bevindingen uit deze periode moeten worden teruggekoppeld naar architectuurkaders, inkoopafspraken en opleidingsplannen voor ontwikkel- en beheerteams, zodat application modernization geen eenmalig project is, maar een structurele verbetering van het digitale fundament.

Monitoring, Compliance en Verbetering

Gebruik PowerShell-script application-modernization.ps1 (functie Invoke-Monitoring) – Inventariseert Azure‑resources en signaleert applicaties die nog niet volgens het modernisatie‑ en governance‑model zijn ingericht..

Gebruik PowerShell-script application-modernization.ps1 (functie Invoke-Remediation) – Genereert rapportages en aanbevelingen voor het moderniseren van legacy‑applicaties en het verbeteren van configuraties..

Modernisatie is geen eenmalige inspanning, maar een continu proces van verbeteren, bijsturen en herzien. Voor Nederlandse overheidsorganisaties betekent dit dat gemoderniseerde applicaties voortdurend moeten worden getoetst aan veranderende wet‑ en regelgeving, nieuwe dreigingsbeelden en updates van het Azure‑platform. Door Azure Policy, Azure Advisor en Microsoft Defender for Cloud integraal in te zetten, kunnen organisaties continu controleren of configuraties nog voldoen aan afgesproken standaarden. Denk aan policies die afdwingen dat alleen goedgekeurde regio’s worden gebruikt, dat versleuteling altijd is ingeschakeld, dat diagnostische logs naar centrale workspaces worden doorgestuurd en dat alleen goedgekeurde SKU’s worden toegepast. Afwijkingen worden zichtbaar gemaakt in dashboards en rapporten, zodat beheerteams gericht verbeteracties kunnen uitvoeren en CISO’s inzicht hebben in de volwassenheid van het applicatielandschap.

Daarnaast moeten lessons learned uit incidenten, audits en pentests structureel worden vertaald naar modernisatie‑ en verbetervoorstellen. Een incident waarbij een legacy‑component uitvalt of een kwetsbaarheid in een oud framework wordt gevonden, kan aanleiding zijn om een applicatie versneld te moderniseren of zelfs te vervangen. Door deze verbanden expliciet te maken in rapportages en dashboards, wordt zichtbaar welke technische schulden de grootste risico’s vormen voor continuïteit en informatiebeveiliging. Het bijbehorende PowerShell‑script kan worden gebruikt om periodiek rapportages te genereren over de status van applicatiemodernisatie, inclusief aantallen workloads per modernisatiefase, aanwezigheid van basisbeveiligingsmaatregelen en naleving van organisatiebrede architectuurprincipes. Zo ontstaat een cyclisch proces van meten, rapporteren en verbeteren waarmee application modernization een vast onderdeel wordt van de reguliere besturing van de digitale overheid.

Compliance & Frameworks

Automation

Gebruik het onderstaande PowerShell script om deze security control te monitoren en te implementeren. Het script bevat functies voor zowel monitoring (-Monitoring) als remediation (-Remediation).

PowerShell
<# .SYNOPSIS Azure Application Modernization inventarisatie en advies .DESCRIPTION Dit script ondersteunt Nederlandse overheidsorganisaties bij het uitvoeren van een lichte inventarisatie van bestaande workloads in Azure en geeft signalen en aanbevelingen voor application modernization richting een beheersbare, veilige en conforme Azure-architectuur. Het script is ontworpen om veilig lokaal of vanuit een beheerde automation-runner te draaien met READ-ONLY rechten. Het voert GEEN wijzigingen door in de omgeving. .NOTES Filename: application-modernization.ps1 Author: Nederlandse Baseline voor Veilige Cloud Created: 2025-11-26 Version: 1.0 Related JSON: content/azure/application/application-modernization.json CIS Control: CIS Microsoft Azure Foundations Benchmark Category: application Workload: azure .LINK https://github.com/m365-tenant-best-practise .EXAMPLE .\application-modernization.ps1 -Monitoring Voert een read-only inventarisatie uit van geselecteerde subscriptions en toont een samenvatting van modernisatiekansen. .EXAMPLE .\application-modernization.ps1 -Remediation -WhatIf Genereert een rapport met concrete aanbevelingen zonder wijzigingen aan te brengen. .EXAMPLE .\application-modernization.ps1 -ExportPath .\modernization-report.json Exporteert de inventarisatie- en aanbevelingsgegevens naar een JSON-bestand. #> #Requires -Version 5.1 #Requires -Modules Az.Accounts, Az.Resources, Az.Monitor [CmdletBinding()] param( [Parameter(HelpMessage = "Voer een read-only inventarisatie en compliancecheck uit")] [switch]$Monitoring, [Parameter(HelpMessage = "Genereer aanbevelingen en high-level roadmap (GEEN wijzigingen)")] [switch]$Remediation, [Parameter(HelpMessage = "Reserve-optie, in dit script worden geen wijzigingen teruggedraaid")] [switch]$Revert, [Parameter(HelpMessage = "Toon welke acties zouden worden uitgevoerd zonder deze echt uit te voeren")] [switch]$WhatIf, [Parameter(HelpMessage = "Optioneel pad om resultaten als JSON te exporteren")] [string]$ExportPath ) $ErrorActionPreference = 'Stop' # ============================================================================ # HEADER # ============================================================================ Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "Azure Application Modernization – Inventarisatie" -ForegroundColor Cyan Write-Host "Nederlandse Baseline voor Veilige Cloud" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan # ============================================================================ # HULPFUNCTIES # ============================================================================ function Connect-NbvvcAzContext { <# .SYNOPSIS Zorgt voor een geldige Az-context voor leesacties .DESCRIPTION Probeert eerst een bestaande context te gebruiken. Als er geen context is, wordt Connect-AzAccount aangeroepen. Dit is geschikt voor lokale debug- scenario's met een interactieve sessie of een managed identity. #> [CmdletBinding()] param() try { $context = Get-AzContext -ErrorAction SilentlyContinue if (-not $context) { Write-Host "Geen actieve Azure-context gevonden. Probeer te verbinden..." -ForegroundColor Yellow Connect-AzAccount -ErrorAction Stop | Out-Null $context = Get-AzContext -ErrorAction Stop } Write-Host "Actieve Azure-context: $($context.Subscription.Name) [$($context.Subscription.Id)]" -ForegroundColor Gray return $context } catch { Write-Host "[FAIL] Kon geen geldige Azure-context verkrijgen: $_" -ForegroundColor Red throw } } function Get-NbvvcModernizationInventory { <# .SYNOPSIS Verzamelt een lichte inventarisatie van workloads voor modernisatie .DESCRIPTION Haalt een selectie van resources op die vaak onderdeel zijn van modernizationtrajecten: App Service, Functions, Kubernetes, VM's en databasediensten. De inventarisatie is read-only en bedoeld als input voor verder architectuur- en portfoliowerk. .OUTPUTS Hashtable met inventarisgegevens #> [CmdletBinding()] param() $inventory = @{ timestamp = Get-Date subscriptionId = (Get-AzContext).Subscription.Id appServices = @() functionApps = @() aksClusters = @() virtualMachines = @() sqlServers = @() sqlDatabases = @() findings = @() } Write-Host "`nInventarisatie van workloads (read-only)..." -ForegroundColor Yellow # App Services try { $apps = Get-AzWebApp -ErrorAction SilentlyContinue foreach ($app in $apps) { $inventory.appServices += [PSCustomObject]@{ Name = $app.Name ResourceGroup = $app.ResourceGroup Kind = $app.Kind Location = $app.Location State = $app.State } } Write-Host " App Services gevonden: $($inventory.appServices.Count)" -ForegroundColor Gray } catch { Write-Host " [WARN] Kon App Services niet opvragen: $_" -ForegroundColor Yellow $inventory.findings += "Kon App Services niet inventariseren; controleer rechten en Az.Websites-module." } # Function Apps (onderdeel van WebApps, maar vaak relevant als aparte categorie) $inventory.functionApps = $inventory.appServices | Where-Object { $_.Kind -like "*functionapp*" } # AKS Clusters try { $aksClusters = Get-AzAksCluster -ErrorAction SilentlyContinue foreach ($cluster in $aksClusters) { $inventory.aksClusters += [PSCustomObject]@{ Name = $cluster.Name ResourceGroup = $cluster.ResourceGroupName Location = $cluster.Location Kubernetes = $cluster.KubernetesVersion } } Write-Host " AKS-clusters gevonden: $($inventory.aksClusters.Count)" -ForegroundColor Gray } catch { Write-Host " [WARN] Kon AKS-clusters niet opvragen: $_" -ForegroundColor Yellow $inventory.findings += "Kon AKS-clusters niet inventariseren; controleer rechten en Az.Aks-module." } # Virtuele Machines try { $vms = Get-AzVM -Status -ErrorAction SilentlyContinue foreach ($vm in $vms) { $inventory.virtualMachines += [PSCustomObject]@{ Name = $vm.Name ResourceGroup = $vm.ResourceGroupName Location = $vm.Location PowerState = ($vm.PowerState -as [string]) OsType = $vm.StorageProfile.OSDisk.OsType } } Write-Host " Virtuele machines gevonden: $($inventory.virtualMachines.Count)" -ForegroundColor Gray } catch { Write-Host " [WARN] Kon virtuele machines niet opvragen: $_" -ForegroundColor Yellow $inventory.findings += "Kon virtuele machines niet inventariseren; controleer rechten en Az.Compute-module." } # SQL Servers en Databases (globale scan, high-level) try { $sqlServers = Get-AzSqlServer -ErrorAction SilentlyContinue foreach ($server in $sqlServers) { $inventory.sqlServers += [PSCustomObject]@{ Name = $server.ServerName ResourceGroup = $server.ResourceGroupName Location = $server.Location } $dbs = Get-AzSqlDatabase -ServerName $server.ServerName -ResourceGroupName $server.ResourceGroupName -ErrorAction SilentlyContinue foreach ($db in $dbs) { if ($db.DatabaseName -eq "master") { continue } $inventory.sqlDatabases += [PSCustomObject]@{ Name = $db.DatabaseName ResourceGroup = $server.ResourceGroupName Server = $server.ServerName Edition = $db.Edition ServiceObjective = $db.CurrentServiceObjectiveName } } } Write-Host " SQL-servers gevonden: $($inventory.sqlServers.Count)" -ForegroundColor Gray Write-Host " SQL-databases gevonden: $($inventory.sqlDatabases.Count)" -ForegroundColor Gray } catch { Write-Host " [WARN] Kon SQL-resources niet opvragen: $_" -ForegroundColor Yellow $inventory.findings += "Kon SQL-resources niet inventariseren; controleer rechten en Az.Sql-module." } return $inventory } function Invoke-Monitoring { <# .SYNOPSIS Voert een read-only modernisatiecheck uit .DESCRIPTION Gebruikt een lichte inventarisatie om inzicht te geven in het aantal klassieke VM-workloads versus PaaS- en containerworkloads. Dit helpt bij het prioriteren van modernizationtrajecten. .OUTPUTS Hashtable met samenvattende metrics en inventarisatie #> [CmdletBinding()] param() $null = Connect-NbvvcAzContext $inventory = Get-NbvvcModernizationInventory $summary = @{ subscriptionId = $inventory.subscriptionId timestamp = $inventory.timestamp appServiceCount = $inventory.appServices.Count functionAppCount = $inventory.functionApps.Count aksClusterCount = $inventory.aksClusters.Count virtualMachineCount = $inventory.virtualMachines.Count sqlDatabaseCount = $inventory.sqlDatabases.Count potentialModernization = @() findings = $inventory.findings } # Eenvoudige indicatoren voor modernizationpotentieel if ($summary.virtualMachineCount -gt 0 -and $summary.appServiceCount -eq 0 -and $summary.aksClusterCount -eq 0) { $summary.potentialModernization += "Veel workloads draaien nog op klassieke virtuele machines; onderzoek rehost/refactor naar App Service, Functions of AKS." } if ($summary.sqlDatabaseCount -gt 0 -and $inventory.sqlServers.Count -gt 0) { $summary.potentialModernization += "Controleer of SQL-databases gebruikmaken van moderne beveiligingsopties (TDE, private endpoints, auditing) en passen binnen de referentiearchitectuur." } if ($summary.appServiceCount -gt 0 -and $summary.functionAppCount -eq 0) { $summary.potentialModernization += "Overweeg serverless‑patronen met Azure Functions voor batchtaken en achtergrondverwerking." } Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "SAMENVATTING INVENTARISATIE" -ForegroundColor Cyan Write-Host " App Services : $($summary.appServiceCount)" -ForegroundColor White Write-Host " Function Apps : $($summary.functionAppCount)" -ForegroundColor White Write-Host " AKS-clusters : $($summary.aksClusterCount)" -ForegroundColor White Write-Host " Virtuele machines : $($summary.virtualMachineCount)" -ForegroundColor White Write-Host " SQL-databases : $($summary.sqlDatabaseCount)" -ForegroundColor White if ($summary.potentialModernization.Count -gt 0) { Write-Host "`nIndicatieve modernization-signalen:" -ForegroundColor Yellow foreach ($msg in $summary.potentialModernization) { Write-Host " - $msg" -ForegroundColor Gray } } else { Write-Host "`nGeen duidelijke modernization-signalen gedetecteerd op basis van deze lichte scan." -ForegroundColor Green } if ($summary.findings.Count -gt 0) { Write-Host "`nAandachtspunten tijdens inventarisatie:" -ForegroundColor Yellow foreach ($f in $summary.findings) { Write-Host " - $f" -ForegroundColor Yellow } } return @{ summary = $summary inventory = $inventory } } function Invoke-Remediation { <# .SYNOPSIS Genereert modernisatie-aanbevelingen en optioneel een JSON-rapport .DESCRIPTION Op basis van de inventarisatie worden concrete aanbevelingen gegenereerd voor vervolgstappen zoals portfoliowerk, architectuuranalyse en migratieplanning. Het script voert zelf geen wijzigingen door. #> [CmdletBinding(SupportsShouldProcess)] param( [string]$ReportPath ) if ($WhatIf) { Write-Host "`nWhatIf: er wordt een aanbevelingsrapport gegenereerd op basis van inventarisatiegegevens, maar er vinden geen wijzigingen plaats." -ForegroundColor Yellow } $result = Invoke-Monitoring $summary = $result.summary $inventory = $result.inventory $recommendations = @() if ($summary.virtualMachineCount -gt 0) { $recommendations += "Stel een gericht modernization‑programma op voor VM‑gebaseerde workloads: identificeer per applicatie of rehost, refactor of rearchitect passend is." } if ($summary.appServiceCount -gt 0 -or $summary.aksClusterCount -gt 0) { $recommendations += "Controleer of alle PaaS‑ en containerworkloads voldoen aan de referentiearchitectuur: identity via managed identities, logging via Azure Monitor en beveiliging via Azure Policy/Defender for Cloud." } if ($summary.sqlDatabaseCount -gt 0) { $recommendations += "Richt een standaard voor databasemodernisatie in, inclusief TDE, private endpoints, auditing en periodieke DR‑tests." } if ($recommendations.Count -eq 0) { $recommendations += "Geen specifieke aanbevelingen op basis van deze lichte scan; voer een diepgaand architectuurassessment uit voor kernsystemen." } Write-Host "`nAanbevolen vervolgstappen:" -ForegroundColor Cyan foreach ($rec in $recommendations) { Write-Host " - $rec" -ForegroundColor White } $report = @{ generatedAt = Get-Date subscriptionId = $summary.subscriptionId modernization = @{ indicators = $summary.potentialModernization recommendations = $recommendations } inventory = $inventory } $targetPath = $null if ($PSBoundParameters.ContainsKey("ReportPath") -and $ReportPath) { $targetPath = $ReportPath } elseif ($ExportPath) { $targetPath = $ExportPath } if ($targetPath) { if ($PSCmdlet.ShouldProcess($targetPath, "Schrijf modernization-rapport naar JSON-bestand")) { $report | ConvertTo-Json -Depth 6 | Out-File -FilePath $targetPath -Encoding UTF8 Write-Host "`n[OK] Rapport geschreven naar: $targetPath" -ForegroundColor Green } } } function Invoke-Revert { <# .SYNOPSIS Placeholder voor revert-logica .DESCRIPTION Dit script voert geen configuratiewijzigingen uit, daarom is er geen revert-implementatie nodig. De functie is aanwezig voor consistentie met andere scripts binnen de Nederlandse Baseline voor Veilige Cloud. #> [CmdletBinding(SupportsShouldProcess)] param() Write-Host "`nEr zijn geen wijzigingen aangebracht door dit script; revert is niet van toepassing." -ForegroundColor Green } # ============================================================================ # MAIN EXECUTION # ============================================================================ try { if ($Revert) { Invoke-Revert } elseif ($Remediation) { Invoke-Remediation -ReportPath $ExportPath } elseif ($Monitoring) { $null = Invoke-Monitoring } else { Write-Host "Beschikbare parameters:" -ForegroundColor Yellow Write-Host " -Monitoring : Voer een read-only inventarisatie uit" -ForegroundColor Gray Write-Host " -Remediation : Genereer modernisatie-aanbevelingen (geen wijzigingen)" -ForegroundColor Gray Write-Host " -Revert : Niet van toepassing (geen wijzigingen)" -ForegroundColor Gray Write-Host " -WhatIf : Toon welke acties logisch zouden zijn zonder uitvoer" -ForegroundColor Gray Write-Host " -ExportPath : Optioneel pad voor JSON-rapport" -ForegroundColor Gray Write-Host "`nVoorbeeld: .\application-modernization.ps1 -Monitoring" -ForegroundColor Cyan } } catch { Write-Error "Scriptuitvoering mislukt: $_" exit 2 } finally { Write-Host "`n========================================`n" -ForegroundColor Cyan } # Exitcodes: # 0 = Succesvolle uitvoering # 2 = Fout tijdens uitvoering

Risico zonder implementatie

Risico zonder implementatie
Medium: Zonder een duidelijke modernisatiestrategie blijven verouderde applicaties een risico voor beveiliging, continuĂŻteit en compliance. Ongepatchte systemen, beperkte schaalbaarheid en gebrek aan observability vergroten de kans op uitval, datalekken en toezichtmaatregelen.

Management Samenvatting

Application modernization naar Azure is noodzakelijk om verouderde overheidsapplicaties toekomstbestendig te maken. Door een gestructureerde strategie, een consistente referentiearchitectuur, gefaseerde migratie en continue monitoring te combineren, kunnen organisaties risico’s reduceren, kosten beheersen en beter voldoen aan BIO, NIS2 en AVG. Implementatie vergt circa 320 uur voor analyse, ontwerp, migratie en inbedding in governance‑processen.