Azure-migratie Voor De Nederlandse Publieke Sector

💼 Management Samenvatting

Migratie naar Azure is voor veel Nederlandse overheidsorganisaties een strategische keuze om modernisering, schaalbaarheid en kostenbesparingen te realiseren. Een succesvolle migratie vereist echter een doordachte aanpak die rekening houdt met beveiliging, compliance, continuïteit en de specifieke eisen van de publieke sector.

Aanbeveling
IMPLEMENT
Risico zonder
High
Risk Score
8/10
Implementatie
140u (tech: 80u)
Van toepassing op:
Azure Tenant
On-premises workloads
Hybride omgevingen

Migraties naar de cloud zijn complexe transformaties die veel meer omvatten dan alleen het verplaatsen van servers. Zonder een gestructureerde aanpak ontstaan snel problemen met beveiliging, compliance, kostenbeheersing en dienstverlening. Voor Nederlandse overheidsorganisaties komt daar bovenop dat migraties moeten voldoen aan strikte eisen vanuit de Baseline Informatiebeveiliging Overheid (BIO), de NIS2 richtlijn, de Algemene Verordening Gegevensbescherming (AVG) en sectorale normenkaders. Een slecht uitgevoerde migratie kan leiden tot datalekken, verstoring van kritieke diensten, niet-naleving van compliance-vereisten, onverwachte kosten en reputatieschade. Bovendien ontbreekt vaak zicht op welke workloads geschikt zijn voor migratie, welke technische uitdagingen moeten worden overwonnen, wat de verwachte kosten zijn en welke beveiligings- en compliance-implicaties de migratie heeft. Zonder duidelijke richtlijnen en best practices is het voor CISO's, architecten en migratieteams lastig om aan bestuurders en toezichthouders uit te leggen of migraties daadwerkelijk veilig en compliant worden uitgevoerd.

PowerShell Modules Vereist
Primary API: Azure Portal, Azure Resource Manager
Connection: Connect-AzAccount
Required Modules: Az.Accounts, Az.Migrate

Implementatie

Dit index-artikel beschrijft hoe u migraties naar Azure inricht en beheert binnen de "Nederlandse Baseline voor Veilige Cloud". We behandelen de rol van migratie binnen de cloudstrategie, de belangrijkste migratieprincipes en -methodologieën, en hoe u governance, assessment, planning en uitvoering organiseert. Daarnaast laten we zien hoe u met een PowerShell-script een eerste overzicht krijgt van de migratiestatus van uw omgeving, zodat u gericht vervolgartikelen en detailcontroles kunt inzetten.

Migratiestrategie en -methodologie

Een succesvolle migratie begint met een duidelijke strategie die aansluit bij de businessdoelen en compliance-vereisten van de organisatie. Voor Nederlandse overheidsorganisaties betekent dit dat migraties niet alleen technisch moeten kloppen, maar ook moeten bijdragen aan modernisering, kostenbeheersing, beveiligingsverbetering en het voldoen aan wettelijke verplichtingen. De migratiestrategie moet daarom expliciet koppelen aan de cloudstrategie, de informatiebeveiligingsstrategie en de digitale transformatieagenda van de organisatie. Dit voorkomt dat migraties worden uitgevoerd als losstaande projecten zonder duidelijke samenhang met de bredere organisatiedoelen.

De Microsoft Cloud Adoption Framework (CAF) biedt een bewezen methodologie voor cloudmigraties die is aangepast aan de behoeften van de publieke sector. Deze methodologie onderscheidt verschillende migratiescenario's: lift-and-shift waarbij workloads worden verplaatst zonder wijzigingen, modernisering waarbij workloads worden geoptimaliseerd voor cloud-native services, en hybride scenario's waarbij workloads gedeeltelijk in de cloud en gedeeltelijk on-premises blijven. Voor elke scenario gelden andere technische, organisatorische en beveiligingsimplicaties. Een lift-and-shift migratie is bijvoorbeeld sneller uit te voeren maar levert minder voordelen op dan een modernisering, terwijl een modernisering meer tijd en expertise vereist maar betere schaalbaarheid, kostenbesparingen en beveiliging oplevert. De keuze voor een scenario hangt af van factoren zoals de kritikaliteit van de workload, de beschikbare tijd en middelen, de technische complexiteit en de compliance-vereisten.

Een ander belangrijk aspect van de migratiestrategie is de prioritering van workloads. Niet alle workloads zijn even geschikt voor migratie, en niet alle workloads hebben dezelfde urgentie. Organisaties moeten daarom een prioriteringsmodel ontwikkelen dat rekening houdt met factoren zoals businesskritikaliteit, technische complexiteit, compliance-vereisten, kostenbesparingspotentieel en risico's. Workloads met hoge businesskritikaliteit en lage technische complexiteit zijn bijvoorbeeld goede kandidaten voor vroege migratie, terwijl workloads met hoge technische complexiteit en lage businesskritikaliteit beter later kunnen worden gemigreerd. Door workloads te prioriteren ontstaat een gefaseerde migratieaanpak die risico's spreidt en geleidelijk expertise opbouwt binnen de organisatie.

Assessment en migratieplanning

Voordat migraties worden gestart, is een grondige assessment essentieel om te begrijpen welke workloads geschikt zijn voor migratie, welke technische uitdagingen moeten worden overwonnen, wat de verwachte kosten zijn en welke beveiligings- en compliance-implicaties de migratie heeft. Azure Migrate biedt geautomatiseerde tools voor discovery en assessment die organisaties helpen om een compleet beeld te krijgen van hun on-premises omgeving. Deze tools voeren continue discovery uit van virtuele machines, fysieke servers, databases, applicaties en netwerkconfiguraties, waarbij alle relevante informatie wordt verzameld zoals CPU-gebruik, geheugengebruik, opslagcapaciteit, netwerkconfiguraties en afhankelijkheden tussen systemen.

De assessment-resultaten worden gebruikt om migratiereadiness te bepalen, kosten te ramen, beveiligingsrisico's te identificeren en migratierecommendaties te genereren. Organisaties kunnen deze informatie gebruiken om migratieplannen te ontwikkelen, budgetten te bepalen, risico's te identificeren en mitigeren, en stakeholders te informeren over de verwachte impact van de migratie. Belangrijk is dat assessments niet alleen technisch zijn, maar ook organisatorische, beveiligings- en compliance-aspecten meenemen. Een workload kan bijvoorbeeld technisch geschikt zijn voor migratie, maar organisatorische of compliance-uitdagingen hebben die eerst moeten worden opgelost voordat migratie kan plaatsvinden.

Op basis van de assessment-resultaten wordt een gedetailleerd migratieplan ontwikkeld dat beschrijft welke workloads worden gemigreerd, in welke volgorde, met welke methodologie, welke resources nodig zijn, welke risico's moeten worden gemitigeerd en hoe de migratie wordt getest en gevalideerd. Het migratieplan moet ook expliciet aandacht besteden aan beveiliging, compliance en continuïteit, zodat migraties niet leiden tot beveiligingslekken, compliance-schendingen of verstoringen van kritieke diensten. Voor Nederlandse overheidsorganisaties betekent dit dat migratieplannen moeten aansluiten bij de Baseline Informatiebeveiliging Overheid (BIO), de NIS2 richtlijn, de AVG en sectorale normenkaders.

Beveiliging en compliance tijdens migratie

Beveiliging en compliance zijn cruciaal tijdens alle fasen van de migratie. Migraties brengen inherente risico's met zich mee, zoals datalekken tijdens data-overdracht, onjuiste configuraties in de doelomgeving, en verstoringen van beveiligingscontroles tijdens de migratie. Organisaties moeten daarom expliciete beveiligingsmaatregelen treffen voor elke fase van de migratie, van assessment tot en met de post-migratie validatie.

Tijdens de assessment-fase moeten organisaties ervoor zorgen dat discovery en assessment op een veilige manier plaatsvinden, waarbij gevoelige informatie wordt beschermd en alleen geautoriseerde personen toegang hebben tot assessment-resultaten. Tijdens de planning-fase moeten beveiligings- en compliance-vereisten expliciet worden meegenomen in het migratieplan, zodat migraties niet leiden tot beveiligingslekken of compliance-schendingen. Tijdens de uitvoering-fase moeten data-overdrachten worden versleuteld, toegangscontroles worden gehandhaafd en alle migratie-activiteiten worden gelogd voor auditdoeleinden. Na de migratie moeten workloads worden gevalideerd om te verifiëren dat beveiligings- en compliance-vereisten daadwerkelijk zijn nageleefd.

Voor Nederlandse overheidsorganisaties betekent dit dat migraties moeten voldoen aan de Baseline Informatiebeveiliging Overheid (BIO), de NIS2 richtlijn, de AVG en sectorale normenkaders. Dit vereist dat organisaties expliciet aandacht besteden aan zaken zoals data-residency, encryptie, toegangsbeheer, logging, monitoring en incidentrespons. Migratieplannen moeten daarom expliciet beschrijven hoe deze vereisten worden nageleefd, welke controles worden uitgevoerd en hoe compliance wordt geverifieerd. Bovendien moeten organisaties ervoor zorgen dat migraties niet leiden tot verstoringen van kritieke diensten, aangezien dit kan leiden tot niet-naleving van service level agreements en reputatieschade.

Monitoring en rapportage van migratiestatus

Gebruik PowerShell-script index.ps1 (functie Invoke-Monitoring) – Geeft een compact overzicht van Azure Migrate-projecten en hun status, inclusief discovery- en assessment-statistieken..

Monitoring van migratiestatus is essentieel om zicht te houden op de voortgang van migraties, te identificeren waar problemen ontstaan en te verifiëren dat migraties volgens plan verlopen. Organisaties moeten daarom structureel zicht hebben op waar Azure Migrate-projecten actief zijn, welke workloads zijn gediscovereerd, welke assessments zijn uitgevoerd, welke migraties zijn gestart en welke migraties zijn voltooid. Dit omvat onder andere het monitoren van het aantal Azure Migrate-projecten per omgeving, het aantal gediscovereerde workloads, het aantal uitgevoerde assessments, het aantal gestarte migraties en het aantal voltooide migraties.

Het bij dit artikel horende PowerShell-script is bewust lichtgewicht gehouden en richt zich op een eerste inventarisatie. Het script leest alle Azure Migrate-projecten in de tenant uit en rapporteert per project onder meer de resourcegroep, locatie, het aantal gediscovereerde workloads, het aantal uitgevoerde assessments en de migratiestatus. De uitvoer kan worden gebruikt als input voor meer gedetailleerde analyses, bijvoorbeeld door resultaten te exporteren naar CSV of in te lezen in een dashboardingoplossing. Belangrijk is dat dit script niet in plaats komt van diepgaande migratie-analyses of gespecialiseerde tooling, maar fungeert als startpunt waarmee u snel ziet waar de grootste migratie-activiteiten plaatsvinden en welke projecten aanvullende aandacht nodig hebben.

Remediatie en structurele verbetering

Gebruik PowerShell-script index.ps1 (functie Invoke-Remediation) – Ondersteunt het structureren van verbeteracties op basis van de inventarisatie van Azure Migrate-projecten en hun status..

Wanneer blijkt dat migraties niet volgens plan verlopen of dat workloads niet adequaat zijn beoordeeld, is een gestructureerde remediatieaanpak nodig. Ad-hoc wijzigingen – bijvoorbeeld het handmatig aanpassen van een enkele migratieconfiguratie – lossen doorgaans slechts symptomen op en vergroten de kans op inconsistenties tussen omgevingen. In plaats daarvan moeten verbetermaatregelen worden vastgelegd in een programma waarin per workload en per migratiefase wordt beschreven welke aanpassing nodig is, wie eigenaar is, welke risico's daarmee worden verkleind en hoe de wijziging wordt getest en uitgerold.

Het script bij dit artikel automatiseert de eerste stap van remediatie: het overzichtelijk maken van de huidige situatie. Door de scriptuitvoer te combineren met interne richtlijnen en referentieconfiguraties, kunnen migratieteams snel zien welke workloads als eerste aandacht vragen. De resultaten worden vertaald naar concrete acties, zoals het uitvoeren van aanvullende assessments, het herzien van migratieplannen, het mitigeren van geïdentificeerde risico's of het aanpassen van migratieconfiguraties. Waar mogelijk worden deze maatregelen opgenomen in Infrastructure as Code-templates en Azure Policy-definities, zodat nieuwe migraties automatisch volgens dezelfde standaard worden uitgevoerd. Zo wordt remediatie niet alleen een eenmalige opschoningsactie, maar onderdeel van een continue verbetercyclus.

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 Overzichtsmonitoring en remediatie voor Azure-migratielandschap .DESCRIPTION Geeft een samenvattend beeld van de belangrijkste Azure-migratiecomponenten (Azure Migrate-projecten, gemigreerde workloads, beveiligingsservices en documentatie) binnen de repository en ondersteunt het gericht dichten van hiaten in migratiestandaarden en configuratieregisters. .NOTES Filename: index.ps1 Author: Nederlandse Baseline voor Veilige Cloud Created: 2025-01-27 Last Modified: 2025-01-27 Version: 1.0 Related JSON: content/azure/migration/index.json .LINK https://github.com/[org]/m365-tenant-best-practise .EXAMPLE .\index.ps1 -Monitoring Toont een samenvattend overzicht van Azure-migratiecomponenten en configuratiestatus. .EXAMPLE .\index.ps1 -Remediation Genereert een basisoverzicht en, indien gewenst, templates voor ontbrekende migratiedocumentatie. #> #Requires -Version 5.1 #Requires -Modules Az.Accounts, Az.Resources, Az.Migrate [CmdletBinding()] param( [Parameter(HelpMessage = "Voer een samenvattende monitoring uit van het Azure-migratielandschap.")] [switch]$Monitoring, [Parameter(HelpMessage = "Genereer remediatie-overzichten en optioneel documentatietemplates.")] [switch]$Remediation, [Parameter(HelpMessage = "Toon welke acties zouden worden uitgevoerd zonder daadwerkelijk te wijzigen.")] [switch]$WhatIf, [Parameter(HelpMessage = "Voer geen live Azure-calls uit maar gebruik voorbeelddata (voor lokale debug).")] [switch]$LocalDebug ) $ErrorActionPreference = 'Stop' $VerbosePreference = 'Continue' function Get-RepositoryRoot { <# .SYNOPSIS Bepaalt de rootmap van de repository op basis van de locatie van dit script. .OUTPUTS String met pad naar repository-root. #> [CmdletBinding()] param() $root = Resolve-Path (Join-Path $PSScriptRoot "..\..\..") -ErrorAction SilentlyContinue if (-not $root) { throw "Kon de repository-root niet bepalen op basis van PSScriptRoot: $PSScriptRoot" } return $root.Path } function Get-AzureMigrationInventory { <# .SYNOPSIS Stelt een overzicht op van Azure-migratie-gerelateerde JSON- en PS1-bestanden. .OUTPUTS PSCustomObject met aantallen en details. #> [CmdletBinding()] param() $repoRoot = Get-RepositoryRoot $contentRoot = Join-Path $repoRoot "content\azure\migration" $codeRoot = Join-Path $repoRoot "code\azure\migration" $jsonFiles = @() if (Test-Path -Path $contentRoot) { $jsonFiles = Get-ChildItem -Path $contentRoot -Filter "*.json" -File -ErrorAction SilentlyContinue } $ps1Files = @() if (Test-Path -Path $codeRoot) { $ps1Files = Get-ChildItem -Path $codeRoot -Filter "*.ps1" -File -ErrorAction SilentlyContinue } $byName = @{} foreach ($json in $jsonFiles) { $base = [System.IO.Path]::GetFileNameWithoutExtension($json.Name) if (-not $byName.ContainsKey($base)) { $byName[$base] = [pscustomobject]@{ Name = $base JsonPath = $null JsonUpdated = $null ScriptPath = $null ScriptUpdated= $null } } $entry = $byName[$base] $entry.JsonPath = $json.FullName $entry.JsonUpdated = $json.LastWriteTime $byName[$base] = $entry } foreach ($ps1 in $ps1Files) { $base = [System.IO.Path]::GetFileNameWithoutExtension($ps1.Name) if (-not $byName.ContainsKey($base)) { $byName[$base] = [pscustomobject]@{ Name = $base JsonPath = $null JsonUpdated = $null ScriptPath = $null ScriptUpdated= $null } } $entry = $byName[$base] $entry.ScriptPath = $ps1.FullName $entry.ScriptUpdated = $ps1.LastWriteTime $byName[$base] = $entry } $items = $byName.Values | Sort-Object Name $missingJson = $items | Where-Object { -not $_.JsonPath } $missingScript = $items | Where-Object { -not $_.ScriptPath } return [pscustomobject]@{ RepositoryRoot = $repoRoot Items = $items MissingJson = $missingJson MissingScripts = $missingScript TotalControls = $items.Count WithJsonAndPs1 = ($items | Where-Object { $_.JsonPath -and $_.ScriptPath }).Count } } function Test-AzureConnection { <# .SYNOPSIS Controleert of er een actieve Azure-verbinding bestaat. .OUTPUTS Boolean: $true als verbonden, anders $false #> [CmdletBinding()] param() try { $context = Get-AzContext -ErrorAction Stop if ($context) { Write-Verbose "Azure-verbinding actief: $($context.Account.Id) in tenant $($context.Tenant.Id)" return $true } return $false } catch { Write-Verbose "Geen actieve Azure-verbinding: $_" return $false } } function Get-AzureMigrationStatus { <# .SYNOPSIS Inventariseert de status van belangrijke Azure-migratiecomponenten. .OUTPUTS PSCustomObject met migratiestatus. #> [CmdletBinding()] param( [switch]$UseDebugData ) if ($UseDebugData) { Write-Verbose "Gebruik van lokale debugdata; er wordt geen verbinding met Azure gemaakt." return [pscustomobject]@{ AzureConnected = $false MigrateProjects = 2 DiscoveredServers = 45 AssessmentsCompleted = 3 MigrationsInProgress = 1 } } $isConnected = Test-AzureConnection if (-not $isConnected) { Write-Warning "Geen actieve Azure-verbinding. Alleen repository-inventarisatie wordt uitgevoerd." return [pscustomobject]@{ AzureConnected = $false MigrateProjects = 0 DiscoveredServers = 0 AssessmentsCompleted = 0 MigrationsInProgress = 0 } } try { Write-Verbose "Inventariseren van Azure-migratiecomponenten..." # Azure Migrate-projecten ophalen (vereist specifieke API-calls) # Voor nu rapporteren we alleen dat er verbinding is $migrateProjects = 0 try { # Get-AzMigrateProject is mogelijk niet beschikbaar in alle Az.Migrate versies # $migrateProjects = (Get-AzMigrateProject -ErrorAction SilentlyContinue).Count Write-Verbose "Azure Migrate-projecten inventarisatie vereist specifieke API-calls." } catch { Write-Verbose "Kon Azure Migrate-projecten niet ophalen: $_" } return [pscustomobject]@{ AzureConnected = $true MigrateProjects = $migrateProjects DiscoveredServers = 0 # Vereist specifieke API-calls AssessmentsCompleted = 0 # Vereist specifieke API-calls MigrationsInProgress = 0 # Vereist specifieke API-calls } } catch { Write-Warning "Fout bij inventariseren van Azure-migratiecomponenten: $_" return [pscustomobject]@{ AzureConnected = $false MigrateProjects = 0 DiscoveredServers = 0 AssessmentsCompleted = 0 MigrationsInProgress = 0 } } } function New-MigrationDocumentationTemplate { <# .SYNOPSIS Maakt een eenvoudige Markdown-template aan voor aanvullende Azure-migratiedocumentatie. #> [CmdletBinding()] param( [Parameter(Mandatory = $true)] [string]$Name, [Parameter(Mandatory = $true)] [string]$OutputPath ) $template = @" # Azure Migratie component: $Name **Laatst bijgewerkt:** $(Get-Date -Format "yyyy-MM-dd") **Documentatie-eigenaar:** [Naam / functie] **Status:** Concept ## 1. Rol in het Azure-migratielandschap [Beschrijf hoe deze component (artikel, script of control) past in de totale Azure-migratiestrategie.] ## 2. Migratiestrategie en -principes [Beschrijf welke migratiestrategie en -principes worden toegepast.] ## 3. Technische implementatie [Beschrijf de concrete Azure-services, configuraties en koppelingen.] ## 4. Beveiligingsmaatregelen [Beschrijf beveiligingslagen, encryptie, toegangscontrole en monitoring tijdens en na migratie.] ## 5. Compliance en governance [Beschrijf hoe wordt voldaan aan BIO, NIS2, AVG en andere relevante kaders.] ## 6. Verbeterpunten en vervolgstappen [Beschrijf bekende verbeterpunten, gepland onderhoud en evaluatiemomenten.] "@ $folder = Split-Path -Path $OutputPath -Parent if (-not (Test-Path -Path $folder)) { New-Item -Path $folder -ItemType Directory -Force | Out-Null } $template | Out-File -FilePath $OutputPath -Encoding UTF8 Write-Host " Template gegenereerd: $OutputPath" -ForegroundColor Green } function Invoke-Monitoring { <# .SYNOPSIS Voert een samenvattende monitoring uit van Azure-migratiecomponenten. .OUTPUTS PSCustomObject met overzichtsresultaten. #> [CmdletBinding()] param() Write-Host "`nMonitoring: Azure Migratie overzicht" -ForegroundColor Yellow Write-Host "=====================================" -ForegroundColor Yellow $inventory = Get-AzureMigrationInventory $azureStatus = Get-AzureMigrationStatus -UseDebugData:$LocalDebug Write-Host "`nRepository-root: $($inventory.RepositoryRoot)" -ForegroundColor Cyan Write-Host "Totaal Azure-migratiecontrols (JSON/PS1-combinaties): $($inventory.TotalControls)" -ForegroundColor Cyan Write-Host "Volledig gekoppeld (JSON + PS1): $($inventory.WithJsonAndPs1)" -ForegroundColor Cyan if ($azureStatus.AzureConnected) { Write-Host "`nAzure-omgeving status:" -ForegroundColor Cyan Write-Host " Azure Migrate-projecten: $($azureStatus.MigrateProjects)" -ForegroundColor Gray Write-Host " Ontdekte servers: $($azureStatus.DiscoveredServers)" -ForegroundColor Gray Write-Host " Voltooide assessments: $($azureStatus.AssessmentsCompleted)" -ForegroundColor Gray Write-Host " Migraties in uitvoering: $($azureStatus.MigrationsInProgress)" -ForegroundColor Gray } elseif ($LocalDebug) { Write-Host "`nAzure-omgeving status (debug data):" -ForegroundColor Cyan Write-Host " Azure Migrate-projecten: $($azureStatus.MigrateProjects)" -ForegroundColor Gray Write-Host " Ontdekte servers: $($azureStatus.DiscoveredServers)" -ForegroundColor Gray Write-Host " Voltooide assessments: $($azureStatus.AssessmentsCompleted)" -ForegroundColor Gray Write-Host " Migraties in uitvoering: $($azureStatus.MigrationsInProgress)" -ForegroundColor Gray } else { Write-Host "`n⚠️ Geen actieve Azure-verbinding. Verbind met Connect-AzAccount voor volledige monitoring." -ForegroundColor Yellow } if ($inventory.MissingJson.Count -gt 0) { Write-Host "`n❌ Ontbrekende JSON voor de volgende scripts:" -ForegroundColor Red foreach ($item in $inventory.MissingJson) { Write-Host " - $($item.Name) (script: $($item.ScriptPath))" -ForegroundColor Red } } if ($inventory.MissingScripts.Count -gt 0) { Write-Host "`n❌ Ontbrekende PS1-scripts voor de volgende JSON-bestanden:" -ForegroundColor Red foreach ($item in $inventory.MissingScripts) { Write-Host " - $($item.Name) (json: $($item.JsonPath))" -ForegroundColor Red } } if (($inventory.MissingJson.Count -eq 0) -and ($inventory.MissingScripts.Count -eq 0)) { Write-Host "`n✅ Alle Azure-migratieartikelen hebben zowel JSON als PS1." -ForegroundColor Green } else { Write-Host "`n⚠️ Er zijn nog hiaten in de JSON/PS1-koppeling voor Azure-migratie." -ForegroundColor Yellow Write-Host " Gebruik -Remediation om gericht met deze hiaten aan de slag te gaan." -ForegroundColor Yellow } return [pscustomobject]@{ Inventory = $inventory AzureStatus = $azureStatus } } function Invoke-Remediation { <# .SYNOPSIS Ondersteunt remediatie door ontbrekende componenten inzichtelijk te maken en optioneel documentatietemplates te genereren. .OUTPUTS PSCustomObject met remediatieadvies. #> [CmdletBinding()] param() Write-Host "`nRemediatie: Azure Migratie overzicht" -ForegroundColor Yellow Write-Host "====================================" -ForegroundColor Yellow $inventory = Get-AzureMigrationInventory $repoRoot = $inventory.RepositoryRoot $docRoot = Join-Path $repoRoot "documentatie\azure-migration" if (-not (Test-Path -Path $docRoot)) { New-Item -Path $docRoot -ItemType Directory -Force | Out-Null } $actions = @() foreach ($item in $inventory.Items) { $action = [pscustomobject]@{ Name = $item.Name HasJson = [bool]$item.JsonPath HasScript = [bool]$item.ScriptPath DocumentationPath = $null DocumentationExists = $false } $docFile = Join-Path $docRoot ("migration-" + $item.Name + ".md") $action.DocumentationPath = $docFile $action.DocumentationExists = Test-Path -Path $docFile if (-not $action.DocumentationExists -and -not $WhatIf) { New-MigrationDocumentationTemplate -Name $item.Name -OutputPath $docFile } elseif (-not $action.DocumentationExists -and $WhatIf) { Write-Host " [WhatIf] Zou documentatietemplate aanmaken: $docFile" -ForegroundColor Yellow } $actions += $action } Write-Host "`nSamenvatting remediatie-status:" -ForegroundColor Cyan Write-Host (" Items zonder JSON: {0}" -f ($actions | Where-Object { -not $_.HasJson }).Count) -ForegroundColor Cyan Write-Host (" Items zonder script: {0}" -f ($actions | Where-Object { -not $_.HasScript }).Count) -ForegroundColor Cyan Write-Host (" Items zonder documentatie: {0}" -f ($actions | Where-Object { -not $_.DocumentationExists }).Count) -ForegroundColor Cyan return $actions } try { Write-Host "`n========================================" -ForegroundColor Cyan Write-Host "Azure Migratie Overzichtsmonitor" -ForegroundColor Cyan Write-Host "Nederlandse Baseline voor Veilige Cloud" -ForegroundColor Cyan Write-Host "========================================`n" -ForegroundColor Cyan if ($Monitoring) { Invoke-Monitoring | Out-Null } elseif ($Remediation) { Invoke-Remediation | Out-Null } else { # Standaard: compacte compliance check via monitoring $result = Invoke-Monitoring if (($result.Inventory.MissingJson.Count -eq 0) -and ($result.Inventory.MissingScripts.Count -eq 0)) { Write-Host "`n✅ COMPLIANT" -ForegroundColor Green } else { Write-Host "`n❌ NON-COMPLIANT" -ForegroundColor Red Write-Host "Run met -Remediation voor een gericht overzicht van hiaten en documentatietemplates." -ForegroundColor Yellow } } } catch { Write-Error "Er is een fout opgetreden in index.ps1: $_" throw } finally { Write-Host "`n========================================`n" -ForegroundColor Cyan }

Risico zonder implementatie

Risico zonder implementatie
High: Wanneer migraties zonder duidelijke strategie, assessment en governance worden uitgevoerd, neemt de kans op mislukte migraties, beveiligingslekken, compliance-schendingen en verstoringen van kritieke diensten sterk toe. Dit ondermijnt het vertrouwen van burgers en bestuurders en kan leiden tot negatieve auditbevindingen en sancties vanuit toezichthouders.

Management Samenvatting

Migraties naar Azure bieden kansen voor modernisering en kostenbesparingen, maar vereisen een doordachte aanpak met aandacht voor beveiliging, compliance en continuïteit. Door een duidelijke migratiestrategie te definiëren, grondige assessments uit te voeren, beveiliging en compliance expliciet mee te nemen, migratiestatus structureel te monitoren en remediatie in een continu verbeterprogramma onder te brengen, kunnen Nederlandse overheidsorganisaties migraties veilig en aantoonbaar compliant uitvoeren.