1. INTERVENANTS

DJEBBOURI Younes
Architecte Azure et DevOps đŸš€đŸ’»âœš

2. PROBLÉMATIQUE

Tu veux bien faire
Tu crĂ©es un Recovery Services Vault (RSV) pour ton projet. Ton collĂšgue en Data fait pareil. Puis l’équipe Infra. Puis une version pour DEV, une autre pour PROD
 Et sans t’en rendre compte, tu te retrouves avec 10 RSV dispatchĂ©s un peu partout.

C’est le dĂ©but du chaos 👇

  • Multiplication des coffres = complexitĂ© de gestion exponentielle
  • Chacun sa config, chacun ses politiques, chacun ses pratiques
  • Difficile de faire un reporting global, d’auditer ce qui est vraiment sauvegardĂ©, ou d’industrialiser
  • Gouvernance impossible : tu veux durcir la sĂ©curitĂ© ou faire Ă©voluer une politique ? Tu dois le faire Ă  la main sur chaque coffre
  • RBAC ? On oublie. Soit les Ă©quipes ont tous les droits sur leur RSV (risquĂ©), soit elles ne peuvent rien faire (bloquant). Il n’y a pas d’entre-deux simple.

Alors pose-toi les bonnes questions :

  • Comment garder une vision claire quand chaque Ă©quipe fait ses propres choix ?
  • Jusqu’oĂč on peut dĂ©lĂ©guer sans risquer des erreurs critiques ?
  • Est-ce qu’on protĂšge bien les bonnes machines, avec le bon niveau de service ?
  • Et surtout : comment faire Ă©voluer tout ça intelligemment dans le temps, sans tout casser ?

3. MODÈLE RECOMMANDÉ

Si tu veux garder le contrĂŽle tout en laissant de l’autonomie aux Ă©quipes, il te faut un socle commun.
Et ce socle, c’est une stratĂ©gie centralisĂ©e des RSV
 mais pensĂ©e intelligemment.

Tu ne crées pas un coffre par projet, par environnement ou par équipe.
Tu crées un RSV par type de criticité, basé sur la technologie de réplication utilisée :

  • LRS (Locally Redundant Storage) : RĂ©plication dans une seule zone, pour les workloads non critiques.
  • ZRS (Zone-Redundant Storage) : RĂ©plication dans plusieurs zones d’une mĂȘme rĂ©gion, pour une rĂ©silience accrue.
  • GRS (Geo-Redundant Storage) : RĂ©plication dans une rĂ©gion secondaire, pour les workloads critiques.
CriticitéNiveau de RéplicationType de RSVExemple
MinorLRS (Local)RSV-LRSrsv-backup-lrs
StandardZRS (Zone)RSV-ZRSrsv-backup-zrs
CritiqueGRS (Geo)RSV-GRSrsv-backup-grs

Et pour faire fonctionner ça à grande échelle, on impose une politique de tags cohérente :

  • CriticiteSauvegarde = minor | standard | critique
  • BackupPolicy = daily | weekly | monthly
  • BackupHeure = 02h | 23h, etc.
  • BackupRetention = 7j | 30j | 90j, etc.

GrĂące Ă  l’automatisation (via script ou Azure Automation), chaque VM peut ĂȘtre :

  • rattachĂ©e automatiquement au bon RSV
  • assignĂ©e Ă  la bonne policy en fonction des tags
  • restaurĂ©e uniquement par les Ă©quipes autorisĂ©es
  • protĂ©gĂ©e des suppressions accidentelles, grĂące Ă  un RBAC restrictif (Restore Only)

💡 Tu gagnes une architecture de sauvegarde :

  • homogĂšne
  • lisible
  • facilement gouvernable

Et surtout : tu poses les bases d’une stratĂ©gie d’entreprise claire et durable, pas un patchwork bricolĂ© par projet

4. AUTOMATISER

Tu veux ĂȘtre sĂ»r que chaque VM soit bien protĂ©gĂ©e ?
Alors n’attends pas que les Ă©quipes s’en souviennent.

On va automatiser le rattachement au RSV et l’application de la bonne stratĂ©gie de sauvegarde, Ă  partir de simples tags.
Voici comment ça s’organise :

Pour chaque VM, on lit les tags suivants :

Tag AzureRĂŽle
CriticiteSauvegardePermet de dĂ©terminer dans quel RSV (LRS, ZRS, GRS) la VM doit ĂȘtre sauvegardĂ©e
BackupPolicyDéfinit la politique complÚte à appliquer : heure de déclenchement, fréquence (daily, weekly
), et durée de rétention

Criticité taguéeRSV cible à utiliserNiveau de réplication
minorrsv-backup-lrsLRS
standardrsv-backup-zrsZRS
critiquersv-backup-grsGRS

C’est ce mapping qui permet de choisir dynamiquement le bon coffre


Un script PowerShell ou un runbook Azure Automation (avec System Assigned Identity) pourra :

  1. Lister toutes les VMs éligibles (ou filtrer via Azure Resource Graph)
  2. Lire leurs tags
  3. Vérifier si elles sont déjà protégées
  4. Les rattacher au RSV cible s’il manque la protection
  5. Appliquer la bonne Backup Policy selon les tags

Et si besoin, notifier l’équipe (via Teams, email, webhook
) en cas de VM non conforme (tag manquant, erreur de policy, etc.)


Dernier point souvent nĂ©gligĂ© : les droits d’accĂšs.

  • Les Ă©quipes ont le droit de restaurer leurs VMs
  • Elles peuvent modifier leurs propres tags si besoin
  • Mais elles n’ont pas le droit de supprimer un backup ou de toucher aux paramĂštres critiques du RSV

🎯 On limite donc la casse tout en laissant un vrai degrĂ© d’autonomie.

5. AJOUTER UNE POLITIQUE

Automatiser c’est bien.
Mais il faut aussi s’assurer que personne n’oublie de taguer ses VMs.

👉 C’est là qu’Azure Policy entre en jeu

On crée une politique de conformité qui impose la présence de :

  • CriticiteSauvegarde
  • BackupPolicy

Deux approches sont possibles :

Avec cette stratĂ©gie, aucune VM ne peut ĂȘtre créée sans ces deux tags.
C’est net, carrĂ©, efficace.

Mais
 ❗ ça peut aussi bloquer certaines Ă©quipes lors d’un dĂ©ploiement

{
  "policyRule": {
    "if": {
      "allOf": [
        {
          "field": "type",
          "equals": "Microsoft.Compute/virtualMachines"
        },
        {
          "field": "tags['CriticiteSauvegarde']",
          "exists": "false"
        },
        {
          "field": "tags['BackupPolicy']",
          "exists": "false"
        }
      ]
    },
    "then": {
      "effect": "Deny"
    }
  }
}

Cette option rajoute les tags manquants automatiquement, avec des valeurs par défaut :

  • CriticiteSauvegarde = standard
  • BackupPolicy = daily-7d

Cela permet de ne bloquer personne, tout en garantissant un minimum de protection.

⚠ Attention cependant :
Si tu utilises Terraform ou Bicep, cette stratĂ©gie peut entraĂźner un petit Ă©cart entre le code d’infrastructure et la rĂ©alitĂ© du portail Azure.
Les tags rajoutés par la policy ne sont pas pris en compte par Terraform ou Bicep , donc bien mettre a jour votre code

6. ARCHITECTURE DE L’AUTOMATISATION

Tu veux une automatisation fiable, traçable, et facile à maintenir. Voici un schéma type basé sur une solution éprouvée :

Composant AzureRĂŽle
Azure Automation AccountContient le Runbook principal
Managed IdentityPermet au Runbook d’agir sur les VMs et RSVs
Runbook PowerShellLogique principale de lecture des tags et affectation des backups
Log Analytics / Azure MonitorCentralise les logs d’exĂ©cution et les erreurs
Azure PolicyOblige les tags nécessaires (CriticiteSauvegarde et BackupPolicy)
  • Manuellement ou toutes les 12h via un schedule
  • Option : dĂ©clenchement par Ă©vĂ©nement (ex. crĂ©ation VM)
  • Liste toutes les VMs dans les scopes dĂ©finis
  • Ignore celles avec un tag IgnoreBackup=true si besoin
  • Extrait les tags CriticiteSauvegarde et BackupPolicy
  • DĂ©termine le RSV cible (ex : rsv-e2-pr-haut)
  • VĂ©rifie si la VM est dĂ©jĂ  protĂ©gĂ©e avec la bonne policy
  • Si ce n’est pas le cas :
    → Ajoute la VM dans le bon RSV
    → Applique la policy correspondante
  • Chaque action est logguĂ©e dans Log Analytics
  • En cas d’erreur ou incohĂ©rence : alerte via Action Group

# Connexion avec Managed Identity
Connect-AzAccount -Identity

# Liste des VMs
$vmList = Get-AzVM -Status

foreach ($vm in $vmList) {
    $tags = $vm.Tags
    $criticite = $tags["CriticiteSauvegarde"]
    $policy = $tags["BackupPolicy"]

    if (-not $criticite -or -not $policy) {
        Write-Output "❌ Tags manquants sur $($vm.Name)"
        # Envoi d'une notification via Action Group (ex. : Teams, email)
        continue
    }

    # Mapping CriticitĂ© → RSV
    $rsvName = switch ($criticite) {
        "minor" { "rsv-backup-lrs" }
        "standard" { "rsv-backup-zrs" }
        "critique" { "rsv-backup-grs" }
        default { Write-Output "❌ CriticitĂ© inconnue pour $($vm.Name)"; continue }
    }

    # Vérifier si la VM est protégée
    $backupItem = Get-AzRecoveryServicesBackupItem -BackupManagementType AzureVM -WorkloadType AzureVM -VaultId (Get-AzRecoveryServicesVault -Name $rsvName).ID | Where-Object { $_.Name -eq $vm.Name }

    if (-not $backupItem) {
        # Activer la sauvegarde
        $policyObject = Get-AzRecoveryServicesBackupProtectionPolicy -Name $policy -VaultId (Get-AzRecoveryServicesVault -Name $rsvName).ID
        Enable-AzRecoveryServicesBackupProtection -ResourceGroupName $vm.ResourceGroupName -Name $vm.Name -Policy $policyObject -VaultId (Get-AzRecoveryServicesVault -Name $rsvName).ID
        Write-Output "✅ VM $($vm.Name) ajoutĂ©e Ă  $rsvName avec policy $policy"
    }
}

8. LIMITATION DE LA SOLUTION

Voici les principales limites de l’approche centralisĂ©e et automatisĂ©e pour la gestion des Recovery Services Vaults (RSV) :

  • 🔮 CoĂ»t des RSV GRS : La rĂ©plication gĂ©o-redondante (GRS) est plus coĂ»teuse que LRS ou ZRS. Pour les workloads non critiques, privilĂ©giez LRS ou ZRS pour optimiser les coĂ»ts
  • 🔮 Terraform/Bicep et Azure Policy : Les tags ajoutĂ©s par une policy DeployIfNotExists peuvent crĂ©er des incohĂ©rences avec le code d’infrastructure si celui-ci n’est pas mis Ă  jour
  • 🔮 Limite de 500 RSV par souscription par rĂ©gion : Azure autorise un maximum de 500 Recovery Services Vaults par souscription dans une rĂ©gion donnĂ©e
  • 🔮 Contraintes rĂ©gionales : Les RSV sont liĂ©s Ă  une rĂ©gion Azure spĂ©cifique. Les donnĂ©es sauvegardĂ©es ne peuvent pas ĂȘtre dĂ©placĂ©es directement vers un autre RSV dans une rĂ©gion diffĂ©rente, ce qui peut compliquer les migrations ou les stratĂ©gies multi-rĂ©gions. De plus, la rĂ©plication GRS nĂ©cessite une rĂ©gion secondaire prĂ©dĂ©finie par Azure, limitant la flexibilitĂ© du choix

PROCHAIN ARTICLE

On vient de passer ensemble toute la mécanique du PCA/PRA cÎté machines virtuelles.
Mais dans Azure, ce n’est qu’une partie du puzzle.

Dans le prochain article, on s’attaquera Ă  la continuitĂ© d’activitĂ© cĂŽtĂ© PaaS :
📩 Azure SQL, App Service, Key Vault, Service Bus

Tous ces services qu’on utilise au quotidien, mais qu’on oublie souvent de protĂ©ger correctement.

Comment les rendre résilients ?
Comment prévoir un plan de reprise sans galérer à tout reconstruire à la main ?
Et surtout, comment éviter les piÚges les plus fréquents ?

On verra tout ça trùs bientît 😉


📎 Pour aller plus loin (docs Microsoft) :