Azure Virtual Desktop : du POC à la prod, la checklist de durcissement
Un POC AVD privé fonctionne — mais il manque la sécurité, l'observabilité, la scalabilité et la DR avant la prod. La roadmap priorisée (P1→P5) + la dette technique à solder : NTFS ACLs FSLogix, rotation de secrets, AVD Insights, custom image, Conditional Access, backup FSLogix.
TL;DR. Un POC AVD 100 % privé qui marche, ce n’est pas une prod. Entre les deux : durcir le storage FSLogix (ACLs NTFS, backup), automatiser la rotation des secrets, brancher l’observabilité (AVD Insights + LAW dédié), scaler les session hosts (custom image,
sessionHostConfiguration), prévoir la DR (FSLogix GZRS / Cloud Cache) et activer les features enterprise (Conditional Access/MFA, Intune, App Attach). Voici la roadmap priorisée par ROI, plus la dette technique du POC à solder.
Publié le 22 juin 2026.
Suite de l’article retex AVD en Landing Zone. Stack : Terraform · Terragrunt · azurerm ~> 4.0 · FSLogix / Azure Files Premium · Windows 11 multi-session.
Le POC est validé : AVD déployé en spoke d’une Landing Zone, zéro endpoint public, profils FSLogix sur Entra Kerberos, Autoscale en place. Mais un POC optimise pour « ça marche », pas pour « ça tient en prod ». Voici ce qu’on rajoute par-dessus, par ordre de priorité / ROI.
P1 — Hygiène & sécurité minimale
NTFS ACLs sur le share FSLogix
Le share profiles est accessible en SMB via Entra Kerberos + RBAC Storage File Data SMB Share Contributor. Mais au niveau NTFS, tout le monde voit les dossiers de tous les autres utilisateurs. Il faut appliquer les ACLs recommandées par Microsoft (depuis une session loggée sur un session host) :
icacls \\<storage>.file.core.windows.net\profiles `
/inheritance:r `
/grant "<domain>\<grp_avd_users>:(M)" `
/grant "CREATOR OWNER:(OI)(CI)(IO)(M)" `
/grant "BUILTIN\Administrators:(F)"
À automatiser via un Custom Script Extension la première fois, ou un Azure Run Command planifié.
Rotation automatique des secrets Key Vault
Le mot de passe admin local des session hosts et la clé du storage account FSLogix expirent à 90 jours. Aujourd’hui la rotation est manuelle. À automatiser :
- Logic App déclenchée par Event Grid (event
SecretNearExpiry), ou - Azure Function en timer trigger,
- Action :
az storage account keys renew+az keyvault secret set.
Le module qui gère les secrets a ignore_changes = [value] → la rotation out-of-band ne crée pas de drift Terraform.
Exemption de policy pour les opérations KV manuelles
Deny-PublicPaaS + Key Vault en public_network_access_enabled = false implique qu’on doit être sur le VPN corp pour lire/écrire un secret via le portail. Deux options : une policy exemption ciblée sur le RG du KV (avec justification + date d’expiration), ou maintenir un accès public restreint par firewall ACLs (IP allowlist) — au risque que la policy le refuse.
Activity log + diagnostic settings
Aucune route vers Log Analytics aujourd’hui. Pour chaque ressource critique (host pool, workspace, session host), activer les diagnostic settings → LAW.
P2 — Observabilité
AVD Insights (LAW dédié)
Microsoft recommande un Log Analytics Workspace dédié AVD. À créer :
law-avd(rétention 30 j en POC, 90 j en prod),- une DCR (Data Collection Rule) avec les perf counters + event logs requis par Insights,
- l’association DCR ↔ session hosts,
- les diagnostic settings host pool / workspace / app group → LAW,
- le workbook AVD Insights.
Côté IaC, ça se traduit par de nouveaux déploiements Terragrunt : law-avd/, dcr-avd/, l’association dcra-avd/, et les diag-*-avd/. Coût indicatif : ingestion LAW ~2–3 €/Go ; pour un session host à faible usage, budget ~10 €/mois.
Action groups + alertes AMBA
Les events du scaling plan, les échecs d’agent des session hosts et les seuils de quota storage sont remontables via Azure Monitor Baseline Alerts. La Landing Zone fournit déjà une base — il reste à ajouter les alertes spécifiques AVD.
P3 — Scalabilité
Plusieurs session hosts
Passer de 1 à 3+ session hosts pour tester un load balancing BreadthFirst + un ramp-up Autoscale réaliste. Points d’attention :
- Availability zones : le module répartit automatiquement sur les zones
1/2/3. - NSG : vérifier que les règles inbound/outbound passent à l’échelle.
- FSLogix : 1 conteneur par utilisateur ; un share supporte ~3000 users concurrents avant d’envisager du sharding multi-shares.
Le nouveau pattern sessionHostConfiguration
Aujourd’hui on gère les session hosts via un compteur de VMs + des extensions. Microsoft a récemment GA le pattern sessionHostConfiguration (sous-ressource du host pool) qui automatise create/update/scale des VMs : plus de gestion individuelle des extensions, update d’image automatique, intégration avec l’Autoscale dynamique. À vérifier : la version d’azurerm qui le supporte.
Image custom (Shared Image Gallery)
On part aujourd’hui de l’image Marketplace win11-24h2-avd. Pour standardiser avec les apps métier pré-installées :
- Créer une VM template, installer les apps + la config.
- Sysprep + generalize.
- Capturer l’image dans une Shared Image Gallery.
- Azure Image Builder pour automatiser le build + le patching mensuel.
- Pointer le module session host sur l’image custom.
P4 — Déploiement prod
Subscription prod
Le placeholder de subscription ID pour l’AVD prod doit être remplacé par le vrai ID une fois la subscription provisionnée, puis :
export TG_ENV="prod"
cd landing-zone/corporate/avd
terragrunt run-all apply
Variables à double-vérifier entre prod et nprd :
- quota FSLogix : dimensionner selon le nombre d’utilisateurs (~30 GiB/user typique).
- nombre de session hosts : baseline + provision pour le pic.
- taille VM :
D4ds_v5ou plus pour des users lourds (Office, Teams, IDE). ramp_down_force_logoff_users: passer àtruepour vraiment éteindre les VMs en fin de journée (en POC c’estfalsepour les tests).- locks sur toutes les RGs (pas seulement network + KV).
DR / région secondaire
Le control plane AVD est redondant automatiquement côté Microsoft (metadata multi-région). Côté données utilisateur (FSLogix) :
- GZRS sur Azure Files (réplication cross-region), ou
- FSLogix Cloud Cache (réplication entre deux storage accounts dans deux régions).
Les session hosts n’ont pas besoin de DR : ils sont stateless (tout l’état user vit dans FSLogix).
P5 — Features enterprise
MFA / Conditional Access
Enforcer le MFA sur la connexion AVD via une policy Conditional Access Entra ID ciblant l’application Azure Virtual Desktop (appId public Microsoft 9cdead84-a844-4324-93f2-b2e6bb768d07). Le provider AzureAD gère ça avec azuread_conditional_access_policy.
Enrollment Intune automatique
Les session hosts Entra-joined peuvent s’enrôler automatiquement dans Intune (policies, déploiement logiciel, compliance) — via le support mdmId sur l’extension AADLoginForWindows.
RDP Shortpath, session recording, App Attach
- RDP Shortpath (UDP, moins de latence) : nécessite d’exposer l’UDP 3390 ou de passer par STUN/TURN public — peu compatible avec un design full-private simple. À reconsidérer face à un vrai besoin perf.
- Session recording (audit/compliance) : Microsoft Purview (en preview) ou solutions tierces. Pas une priorité POC.
- App Attach / MSIX : packager les apps métier en MSIX et les attacher dynamiquement au session host plutôt que les figer dans l’image → image plus légère + versioning des apps.
La dette technique du POC à solder
shared_access_key_enabled = truesur le storage FSLogix — activé pour que Terraform gère le share via data plane. À durcir en prod : désactiver la shared key, donner au SP Terragrunt le rôle adéquat pour gérer les shares via control plane, et passer le provider enstorage_use_azuread = true.- Pas de backup FSLogix — aucun backup des conteneurs VHDX. Le ZRS protège contre une panne de zone, pas contre l’erreur humaine ou la suppression. Prévoir Azure Backup pour Azure Files (ou des snapshots planifiés).
- Pas de scaling horizontal FSLogix — un seul storage account pour tous les profils. Au-delà de ~3000 users concurrents, prévoir du sharding multi-comptes (FSLogix
CCDLocations/ répartition par groupe AD). - Résolution DNS non-IaC — la NRPT côté poste et le wire de la zone
privatelink-global.wvd.microsoft.comsont manuels. À industrialiser : une policy ALZ customDeploy-Private-DNS-AVD-Globalqui auto-wire le zone group quand un PEglobalest détecté, ou unignore_changesconditionnel sur le module PE.
Aucune de ces évolutions n’est bloquante pour démontrer la valeur d’AVD. Mais entre un POC qui tourne et une prod régulée qui tient, c’est précisément cette liste qui fait la différence — et la trier par ROI évite de tout vouloir faire d’un coup.