WIKI Retour au Portfolio

Dernière mise à jour : 12 juin 2026

14 — Annexe : Pièges AZ-104 + Commandes essentielles

Récap des pièges classiques de l'examen + toutes les commandes que tu peux croiser (CLI / PowerShell / AzCopy / kubectl / autres).


PARTIE 1 — Pièges classiques par domaine

🟢 Identity (Entra ID / RBAC)

Entra ID

  • App Registration ≠ Enterprise Application :
    • App Reg = définition de l'app (Application object dans le tenant home)
    • Enterprise App = instance/Service Principal qui consomme l'app
    • Une app SaaS tierce dans ton tenant = Enterprise App seule (pas d'App Reg)
  • Managed Identity SA vs UA :
    • SA = supprimée avec la ressource, 1:1
    • UA = ressource indépendante, partageable, persiste après suppression de la VM
  • Cocher "Microsoft Entra roles can be assigned to the group" = uniquement à la création, irréversible. P1 requis.
  • Restricted Management AU = activable uniquement à la création, irréversible.
  • Pas de licence sans Usage Location définie sur l'user → erreur licenseAssignmentNotAllowed.
  • 💡 UsageLocation modifiable côté Entra même pour users hybrid synced (attribut Entra-only, n'existe pas dans AD on-prem). Department/Job Title etc. = on-prem only.
  • Groupe dynamique ne peut pas mixer users + devices (un seul type).
  • Tenant Root Group : même un Global Admin n'a pas accès auto aux ressources Azure → activer Access management for Azure resources.

RBAC

  • Azure RBAC ≠ Entra ID Roles :
    • Azure RBAC = ressources Azure (VM, Storage, RG…)
    • Entra ID Roles = objets Entra (users, groupes, apps)
  • Owner = Contributor + gestion des accès (RBAC).
  • Contributor ne peut PAS gérer les accès (ni RBAC ni locks).
  • NotActions ≠ Deny rule → c'est juste une exclusion de l'allow.
  • Permissions cumulatives : si user a 2 rôles, il a l'union des permissions.
  • Deny assignment > Role assignment mais Deny est rare (Azure-only, ex Blueprints).
  • Custom RBAC role : Owner ou User Access Admin requis pour créer.
  • Custom Entra Role : P1 requis + Global Admin ou Privileged Role Admin.
  • 🚨 Policy least-privilege : Resource Policy Contributor (créer/assigner Policy) ≠ Contributor plein. Pareil : Cost Management Contributor (FinOps), Reservation Administrator (RIs).
  • Cloud Device Administrator = gère devices Entra + BitLocker, PAS les groupes (≠ User Admin).

Authentification

  • Security DefaultsConditional Access = mutuellement exclusifs.
  • Activer une CAP désactive automatiquement Security Defaults.
  • Toujours exclure un compte break-glass des CAP (sinon lockout total).
  • 🚨 Legacy MFA per-user + legacy SSPR Authentication methods dépréciés 30 sept 2025 → migration vers Authentication Methods policy.
  • 🚨 Identity Protection legacy policies (User risk / Sign-in risk / MFA registration) retraite 1er oct 2026 → migrer vers CAP avec conditions de risque.

Licensing pièges

  • P1 = CA, SSPR, Dynamic Groups, AU, Group-based licensing, Entra Custom Roles, groupes assignables aux roles
  • P2 = P1 + Identity Protection, PIM, Access Reviews
  • Entra ID Governance (add-on payant, nécessite P2) = Lifecycle Workflows, advanced Access Reviews

🟢 Compute (VM, VMSS, App Service, Containers)

VM

  • Stopped ≠ Stopped (Deallocated) :
    • Stopped (depuis l'OS, shutdown /s) = compute toujours payé
    • Stopped (Deallocated, bouton Stop portail / az vm deallocate) = compute ❌ payé, storage ✅ payé
  • 🚨 Quota vCPU ≠ billing : Stopped Deallocated consomme toujours le quota (régional + family). Libérer le quota = delete la VM. Piège calcul quota → compter les VMs deallocated.
  • On ne peut PAS changer : nom de la VM, VNet, region.
  • Move VM cross-region = ❌ pas de move direct → ASR ou snapshot+recreate.
  • Resize VM = stoppe la VM, parfois certaines sizes invisibles tant que la VM tourne (cluster physique limité).
  • Quotas par sub sur les cores → vérifier Usage + quotas avant déploiement massif.
  • OS Disk resize = uniquement vers le haut, VM doit être deallocated.
  • Temp Disk (D: Windows) = non persistant, perdu au deallocate.
  • Generation 2 requis pour Trusted Launch + Confidential VMs.

Disks

  • Ultra Disk et Premium SSD v2 = uniquement Data disks (pas OS).
  • Standard HDD : 🚨 retraite 1er sept 2026.
  • Convert disk type = VM doit être stoppée.
  • CMK sur disque = Disk Encryption Set (DES) + KV avec soft-delete + purge protection.

VMSS

  • Mode (Uniform/Flexible) IMMUABLE une fois créé → recréer pour migrer.
  • Flexible = mode recommandé MS depuis 2023.
  • Resize d'1 instance Uniform = redémarre TOUTES les instances.
  • Pas d'Upgrade Policy sur Flexible.

Availability Sets / Zones / PPG

  • AS et AZ = mécanismes différents, on ne combine pas pour une même VM.
  • VM existante NE PEUT PAS être ajoutée à un AS post-création.
  • AS Settings (FD/UD) non modifiables après création.
  • AS = même region + même RG.
  • Une AZ peut contenir plusieurs datacenters → pour low latency utiliser PPG en plus.

Encryption

  • 🚨 ADE retraite 15 sept 2028 → migrer vers Encryption at Host.
  • SSE = always-on, transparent, gratuit (pas désactivable).
  • Encryption at Host = activable uniquement si feature registered sur la sub + size compatible.
  • ADE + KEK setup KV (encore en exam) : (1) générer KEK dans KV + (2) update access policy pour le RP Azure Disk Encryption (PAS Microsoft.Compute). Soft-delete/purge protection = best practice mais pas requirement.

App Service

  • Slots disponibles à partir de Standard (pas Basic). Standard=5, Premium v3=20, Isolated v2=20.
  • Plan = même région, plan ne mixe pas Linux + Windows.
  • Private Endpoint sur slots = ❌ pas supporté (juste sur le slot prod).
  • VNet Integration = subnet dédié + délégué à Microsoft.Web/serverFarms, /27 minimum.
  • Hybrid Connections = TCP via 443 uniquement (pas UDP).
  • WAF pas dans App Service → mettre App Gateway v2 WAF ou Front Door WAF Premium devant.
  • Slot settings (sticky) = à cocher pour rester dans leur slot lors d'un swap.

Containers

  • AKS network plugin : Kubenet legacy → préférer Azure CNI Overlay.
  • 🚨 HPA AKS : nécessite Kubernetes Metrics Server (installé par défaut sur AKS). Pas Dashboard (visualisation), pas Cluster Autoscaler (scale nodes ≠ pods).
  • ACR Premium requis pour : geo-replication, Private Endpoint, Content Trust, customer-managed keys.
  • ACR pour passer Premium → Standard/Basic : supprimer geo-replications + private endpoints d'abord.
  • ACI = pas de scale natif, pas de LB, pas de stateful.
  • ACA = scale-to-zero natif, basé sur K8s mais pas d'accès K8s direct.
  • ACA subnet sizing : workload profiles env = /27 min, consumption only = /23 min. Environment type figé à la création.

🟢 Storage

  • GPv1 : 🚨 retraite 13 oct 2026.
  • BlobStorage legacy : 🚨 création bloquée 3 mars 2026.
  • HNS (Data Lake Gen2) = à cocher à la création, irréversible.
  • Premium Block Blob = pas d'access tiers (pas Cool/Archive).
  • Archive tier = blob doit être rehydraté (1-15h) avant d'être lu.
  • Min retention : Cool 30j, Cold 90j, Archive 180j → frais d'early deletion sinon.
  • Append blob ne supporte PAS les access tiers → seulement règle delete dans lifecycle.
  • Anonymous public access : 🚨 désactivé par défaut (depuis nov 2023).
  • Object Replication : prérequis = Versioning + Change Feed activés sur source ET dest. SA = GPv2 ou Premium Block Blob (pas GPv1, pas BlobStorage legacy).
  • 🚨 Object Replication ≠ GRS : GRS force le regional pair (pas de choix de region). Pour répliquer vers une region spécifique (compliance) → Object Replication.
  • Pas de réplication des blobs Archive (les rehydrater d'abord).
  • Immutable Storage Time-based Locked = irréversible.
  • Failover Storage = la sub passe en LRS dans la région secondaire (perd le geo).
  • ContributorStorage Blob Data Contributor :
    • Contributor (control plane) gère le SA mais PAS d'accès aux data
    • Storage Blob Data Contributor (data plane) = accès aux blobs
  • User Delegation SAS = recommandé MS, ne dépend pas de l'access key.
  • ⚠️ Max 5 stored access policies par container/share/queue/table.
  • Access keys : à désactiver en prod (Allow Shared Key access: Disabled).
  • NFS file share = uniquement sur FileStorage + privé obligatoire (Service/Private Endpoint).
  • Azure Files identity auth : 3 méthodes mutuellement exclusives par SA (AD DS / Entra DS / Entra Kerberos).
  • 1 Sync Group File Sync = 1 cloud endpoint (1 share). N server endpoints OK.
  • 🚨 1 server = max 1 server endpoint dans le MÊME sync group (impossible d'avoir F:\a + F:\b du même server dans 1 sync group).
  • Ordre File Sync : Storage Sync Service → install agent → register server → sync group + cloud endpoint → server endpoint.
  • AzCopy auth = SAS ou Entra ID UNIQUEMENT (pas Kerberos, pas API key) pour Blob ET Files. Multi-OS (Win/Linux/macOS).
  • Cross-region restore Storage = pas natif → AzCopy ou Object Replication.

🟢 Networking

VNet & Subnets

  • 5 IPs réservées par subnet (/24 = 251 utilisables).
  • Subnets noms réservés : GatewaySubnet, AzureBastionSubnet, AzureFirewallSubnet, RouteServerSubnet.
  • Pas d'overlap d'IP entre VNets peerés.
  • VNet = régional, peering possible cross-region.

NSG

  • NSG NIC + NSG Subnet = s'appliquent en série (le plus restrictif gagne) :
    • Inbound : Subnet → puis NIC
    • Outbound : NIC → puis Subnet
  • Default rules non supprimables (priority 65000+) : AllowVNetIn/Out, AllowAzureLoadBalancerIn, AllowInternetOutBound, DenyAll*.
  • Stateful : si inbound autorisé, retour outbound auto.
  • ASG : NICs dans le même VNet uniquement. ASG locked sur le VNet à la 1ère association.
  • Pas de Service Tag custom (tous gérés par MS).

IP & Outbound

  • 🚨 Basic Public IP RETIRÉ depuis 30 sept 2025.
  • Standard Public IP = inbound bloqué par défaut (sauf NSG explicite).
  • 🚨 Standard Public IP = Static obligatoire (Dynamic réservé Basic, retiré).
  • 🚨 Default outbound access retiré pour nouveaux VNets après 31 mars 2026 → utiliser NAT Gateway.
  • NAT GW : 1 seule Public IP = pas de SLA. Prefix /28 (16 IPs) recommandé prod.

Peering

  • Pas de transitivité : A↔B + B↔C ≠ A↔C → utiliser hub-spoke avec NVA, ou vWAN.
  • Pas chiffré par défaut (option Encryption disponible si supportée).
  • Bilatéral : configurer A→B ET B→A.
  • Gateway transit incompatible avec VPN Gateway Basic SKU.
  • Spoke = consomme 1 seul remote gateway max.

Service Endpoint vs Private Endpoint

Service Endpoint Private Endpoint
Niveau Subnet Ressource
Granularité Tous les comptes du type 1 ressource
IP privée dans VNet
Accès on-prem ✅ (via VPN/ER)
  • Private Endpoint sans Private DNS Zone → résolution renvoie l'IP publique. TOUJOURS intégrer la zone.

VPN Gateway

  • 🚨 Standard / High Performance retraite 30 juin 2026 → upgrade auto vers VpnGw1AZ/VpnGw2AZ.
  • 🚨 VpnGw1-5 (non-AZ) : création bloquée 1er nov 2025, déprécation après sept 2026.
  • Basic SKU = pas de BGP, pas de gateway transit, pas d'AZ.
  • Active-Active : 2 instances + 2 tunnels (HA + bande passante doublée).
  • GatewaySubnet = nom obligatoire, /27 minimum.
  • Ordre S2S BGP (drag-and-drop exam) : GatewaySubnet → VPN GW BGP-enabled → Local Network GW → VPN Connection.
  • P2S après changement topologie (peering ajouté, transit gateway, etc.) → re-télécharger + réinstaller le VPN client config sur les postes (sinon nouvelles routes absentes). Pas restart GW, pas modif transit.

Routing (UDR)

  • Précédence : UDR > BGP > System routes (la plus spécifique gagne).
  • NVA doit avoir IP forwarding activé sur sa NIC (sinon paquet droppé).
  • Route table associée au SUBNET (pas VNet, pas NIC).

Load Balancers

  • 🚨 Basic LB retiré 30 sept 2025.
  • Standard LB outbound bloqué par défaut → outbound rule OU NAT GW.
  • SKU LB doit matcher SKU Public IP + VMs backend.
  • 🚨 App Gateway v1 retraite 28 avril 2026 → migrer vers v2.
  • App Gateway = subnet dédié, /27 minimum.

DNS

  • Private DNS Zone auto-registration = 1 seul VNet par zone peut l'avoir.
  • Zones Private Endpoint : privatelink.<service> (ex privatelink.blob.core.windows.net).
  • Azure DNS Private Resolver = subnet délégué Microsoft.Network/dnsResolvers, /28 minimum.
  • Import zone file Azure DNS = CLI + Portail UNIQUEMENT (pas PowerShell, pas ARM, pas Cloud Shell standalone — Cloud Shell exécute la CLI mais l'outil c'est la CLI).

🟢 Governance

Hiérarchie & Subscriptions

  • 6 niveaux de MGs max sous le Tenant Root.
  • 1 sub = 1 MG, 1 sub = 1 tenant (à la fois).
  • Move sub vers autre tenant = perte des RBAC (à réassigner).

Tags

  • PAS hérités par défaut : tag sur RG ne descend PAS sur ressources.
  • 2 mécanismes d'inheritance :
    • Cost Mgmt Tag Inheritance = sur records de billing seulement
    • Azure Policy (Inherit a tag from RG) = modifie réellement les ressources
  • Max 50 tags / ressource.
  • Certaines ressources ne supportent pas les tags.

Locks

  • Le plus restrictif gagne (Delete + ReadOnly = ReadOnly).
  • Hérités descendant.
  • Contributor ne peut PAS modifier les locks → besoin Microsoft.Authorization/locks/*.
  • Locks ne bloquent PAS les opérations data plane (ex: ReadOnly Storage = on peut toujours upload des blobs).

Cost Management

  • Budget = alerte uniquement, n'arrête rien automatiquement.
  • 5 niveaux d'alerte par budget.
  • Advisor pour cibler des RG précis (ex: identifier disks unattached uniquement dans 2-3 RG) : Advisor > Configuration > Resources → décocher les RG non concernés. Pas via Cost Management filtres, pas via Billing Admin role, pas via Azure Monitor custom query.

Azure Policy

  • Modify + DINE : nécessitent Managed Identity côté assignment + Contributor.
  • Remediation : DINE/Modify n'agissent que sur nouvelles ressources → Remediation Task pour existantes.
  • NotActions ≠ Deny (déjà mentionné en RBAC).

ARM / Bicep

  • Mode Complete = DANGEREUX : supprime les ressources non listées dans le RG.
  • Incremental = default, safe.
  • Linked templates : URL accessible publiquement ou via SAS (pas de fichier local).
  • What-if = simule sans déployer.

Move Resources

  • Cross-region = ❌ pas natif (ASR / Resource Mover / recreate).
  • RBAC + Locks : pas déplacés (à recréer).
  • Tags : conservés.
  • Source + dest LOCKED pendant le move.

Key Vault

  • 🚨 API 2026-02-01 : nouveaux KV par défaut en Azure RBAC (au lieu d'Access Policies).
  • Soft-delete = activé par défaut, non désactivable depuis 2020.
  • Purge protection = irréversible une fois activée.
  • CMK = nécessite Soft-delete + Purge protection activés.
  • Owner / Contributor (control plane) ≠ accès data → besoin de rôles data plane.

🟢 Backup / DR

  • Backup ≠ ASR : Backup = données, ASR = continuité d'activité (VM up ailleurs).
  • RSV redundancy = verrouillée après 1ère protection.
  • RSV régional = ressources backupées dans la même région.
  • MARS passphrase perdue = backups perdus (MS ne peut pas la récup).
  • Immutable Vault Locked = irréversible.
  • Failover ASR : commit + re-protect pour pouvoir failback.
  • Test failover = VNet isolé (pas le prod !).
  • Recovery Plan = orchestration multi-VM avec Automation runbooks.
  • CRR (Cross Region Restore) requiert vault GRS.
  • ASR failover réel (3 actions QCM "Select THREE") : (1) Verify VMs protected & healthy, (2) Run failover, (3) Reprotect. Pas Initiate replication (= setup), pas Test failover (= drill), pas Failback (= étape post-restauration).
  • 🚨 ASR exige managed disks : unmanaged disks → conversion préalable (VM > Disks > Migrate to managed disks, VM stoppée).

🟢 Monitoring

  • 🚨 Diagnostics extension dépréciée 31 mars 2026 → AMA + DCRs.
  • 🚨 App Insights : Agent (no code changes) vs SDK (code custom). Profiler = trace slow web requests (hot code path).
  • 🚨 MMA déjà retiré (août 2024).
  • 🚨 NSG Flow Logs retraite 30 sept 2027 (création bloquée juin 2025) → VNet Flow Logs.
  • 🚨 Connection Monitor Classic retiré 1er juillet 2024 → nouveau Connection Monitor.
  • Service Health vs Resource Health :
    • Service Health = panne côté MS
    • Resource Health = ta ressource individuellement
  • 5 diagnostic settings max par ressource.
  • Activity Log = 90 jours gratuits → diagnostic settings pour archiver plus.
  • Metrics rétention = 93 jours (gratuit).
  • LAW retention : 30j gratuit, 730j max (avec Archive jusqu'à 12 ans).

PARTIE 2 — Commandes essentielles

A. Azure CLI (az)

Préinstallé dans Cloud Shell. Sinon az login + az account set --subscription <id>.

Login & contexte

az login                                    # interactif (browser)
az login --identity                         # MI System-Assigned
az login --identity --username <client-id>  # MI User-Assigned
az login --service-principal -u <appId> -p <secret> --tenant <tenantId>

az account list --output table
az account set --subscription "My Sub"
az account show

Resource Groups

az group create -n myrg -l eastus
az group list --output table
az group show -n myrg
az group delete -n myrg --yes --no-wait

Tags

az tag create --resource-id <id> --tags env=prod owner=team
az resource tag --tags env=prod -g myrg -n myvm --resource-type Microsoft.Compute/virtualMachines

VMs

# Create
az vm create -g myrg -n myvm \
  --image Ubuntu2204 --size Standard_B2s \
  --admin-username azureuser --generate-ssh-keys \
  --vnet-name myvnet --subnet mysubnet \
  --public-ip-sku Standard --nsg-rule SSH

# Lifecycle
az vm start -g myrg -n myvm
az vm stop -g myrg -n myvm           # stopped, payé
az vm deallocate -g myrg -n myvm     # ❌ compute payé
az vm restart -g myrg -n myvm
az vm redeploy -g myrg -n myvm

# Resize
az vm resize -g myrg -n myvm --size Standard_D4s_v5

# List
az vm list -d --output table         # -d = details + état
az vm list-sizes -l eastus --output table

# Extension
az vm extension set -g myrg --vm-name myvm \
  --name CustomScriptExtension --publisher Microsoft.Compute \
  --settings '{"fileUris":["https://..."]}'

# Run command (sans RDP/SSH)
az vm run-command invoke -g myrg -n myvm --command-id RunShellScript --scripts "uptime"

Disks

az disk create -g myrg -n mydisk --size-gb 128 --sku Premium_LRS
az disk attach -g myrg --vm-name myvm --disk mydisk
az disk update -g myrg -n mydisk --size-gb 256
az snapshot create -g myrg -n mysnap --source mydisk

VMSS

az vmss create -g myrg -n myvmss \
  --orchestration-mode Flexible \
  --image Ubuntu2204 --instance-count 3 \
  --upgrade-policy-mode rolling

az vmss scale -g myrg -n myvmss --new-capacity 5
az vmss list-instances -g myrg -n myvmss
az vmss update-instances -g myrg -n myvmss --instance-ids "*"

Storage

# Create SA
az storage account create -g myrg -n mysa \
  --location eastus --sku Standard_GRS --kind StorageV2 \
  --allow-blob-public-access false --min-tls-version TLS1_2

# Get keys / connection string
az storage account keys list -g myrg -n mysa
az storage account show-connection-string -g myrg -n mysa

# Container
az storage container create -n mycontainer --account-name mysa --auth-mode login
az storage container list --account-name mysa --auth-mode login

# Blob ops (auth via Entra)
az storage blob upload -f ./file.txt -c mycontainer -n file.txt --account-name mysa --auth-mode login
az storage blob upload-batch -d mycontainer -s ./folder --account-name mysa --auth-mode login
az storage blob download -c mycontainer -n file.txt -f ./file.txt --account-name mysa --auth-mode login
az storage blob list -c mycontainer --account-name mysa --auth-mode login -o table

# Tier
az storage blob set-tier -c mycontainer -n file.txt --tier Cool --account-name mysa --auth-mode login

# SAS
az storage container generate-sas -n mycontainer --permissions r --expiry 2026-12-31 --account-name mysa --auth-mode login --as-user

# File share
az storage share create -n myshare --account-name mysa --account-key <key>

Networking

# VNet + Subnet
az network vnet create -g myrg -n myvnet \
  --address-prefix 10.0.0.0/16 --subnet-name mysubnet --subnet-prefix 10.0.1.0/24

az network vnet subnet create -g myrg --vnet-name myvnet -n subnet2 --address-prefix 10.0.2.0/24

# NSG
az network nsg create -g myrg -n mynsg
az network nsg rule create -g myrg --nsg-name mynsg -n AllowSSH \
  --priority 100 --access Allow --protocol Tcp \
  --source-address-prefixes Internet --destination-port-ranges 22

az network vnet subnet update -g myrg --vnet-name myvnet -n mysubnet --network-security-group mynsg

# Public IP
az network public-ip create -g myrg -n myip --sku Standard --allocation-method Static --zone 1 2 3

# Peering
az network vnet peering create -g myrg -n peer-a-to-b \
  --vnet-name vnet-a --remote-vnet vnet-b --allow-vnet-access

# Route table
az network route-table create -g myrg -n myrt
az network route-table route create -g myrg --route-table-name myrt -n default \
  --address-prefix 0.0.0.0/0 --next-hop-type VirtualAppliance --next-hop-ip-address 10.0.0.4

# Private Endpoint
az network private-endpoint create -g myrg -n myendpoint \
  --vnet-name myvnet --subnet mysubnet \
  --private-connection-resource-id /subscriptions/.../mysa \
  --group-id blob --connection-name myconn

Identity / RBAC

# Role assignments
az role assignment create --assignee [email protected] --role "Virtual Machine Contributor" --scope /subscriptions/<sub>
az role assignment list --scope /subscriptions/<sub> --output table
az role assignment delete --assignee [email protected] --role "Reader"

# Custom role
az role definition create --role-definition ./customrole.json
az role definition list --custom-role-only true

# Check access
az role assignment list --assignee [email protected] --all

Key Vault

az keyvault create -g myrg -n myvault --enable-rbac-authorization --enable-purge-protection
az keyvault secret set --vault-name myvault -n mysecret --value "supersecret"
az keyvault secret show --vault-name myvault -n mysecret --query value -o tsv
az keyvault list-deleted
az keyvault recover --name myvault
az keyvault purge --name myvault

Policy

az policy assignment create --name require-tag --policy <policy-id> --scope /subscriptions/<sub>
az policy state list --filter "complianceState eq 'NonCompliant'"
az policy state trigger-scan --resource-group myrg

Bicep / ARM deployment

# RG-level
az deployment group create -g myrg --template-file main.bicep --parameters @params.json
az deployment group what-if -g myrg --template-file main.bicep
az deployment group list -g myrg

# Sub-level
az deployment sub create -l eastus --template-file main.bicep
az deployment mg create -m mymg -l eastus --template-file main.bicep

# Bicep tools
az bicep install
az bicep build --file main.bicep              # Bicep → ARM JSON
az bicep decompile --file template.json       # ARM JSON → Bicep

Move

az resource move --destination-group target-rg --ids <resource-id>
az resource move --destination-subscription-id <sub-id> --destination-group target-rg --ids <resource-id>

AKS / Containers

# AKS
az aks create -g myrg -n myaks --node-count 2 --enable-managed-identity --enable-aad
az aks get-credentials -g myrg -n myaks
az aks update -g myrg -n myaks --attach-acr myacr
az aks scale -g myrg -n myaks --node-count 5
az aks upgrade -g myrg -n myaks --kubernetes-version 1.30.0

# ACR
az acr create -g myrg -n myacr --sku Standard
az acr login --name myacr
az acr build --registry myacr --image myapp:v1 .
az acr repository list --name myacr -o table
az acr update -n myacr --sku Premium

# ACI
az container create -g myrg -n myci --image nginx --cpu 1 --memory 1.5 --ports 80 --dns-name-label myci-prod
az container logs -g myrg -n myci

# Container Apps
az containerapp env create -g myrg -n myenv -l eastus
az containerapp create -g myrg -n myapp --environment myenv --image nginx --target-port 80 --ingress external

Backup / ASR

# RSV
az backup vault create -g myrg -n myvault -l eastus

# VM backup
az backup protection enable-for-vm -g myrg -v myvault \
  --vm myvm --policy-name DefaultPolicy

az backup protection backup-now -g myrg -v myvault \
  --container-name myvm --item-name myvm --backup-management-type AzureIaasVM

# List recovery points
az backup recoverypoint list -g myrg -v myvault \
  --backup-management-type AzureIaasVM --container-name myvm --item-name myvm

B. Azure PowerShell (Az module)

Module : Az (anciennement AzureRM, deprecated). Installer : Install-Module Az.

Login & contexte

Connect-AzAccount
Connect-AzAccount -Identity                    # Managed Identity
Set-AzContext -Subscription "My Sub"
Get-AzContext
Get-AzSubscription

Resource Groups

New-AzResourceGroup -Name myrg -Location eastus
Get-AzResourceGroup
Remove-AzResourceGroup -Name myrg -Force

VM

# Create simple
New-AzVm -ResourceGroupName myrg -Name myvm -Image Ubuntu2204 -Credential (Get-Credential) -Size Standard_B2s

# Lifecycle
Start-AzVM -ResourceGroupName myrg -Name myvm
Stop-AzVM -ResourceGroupName myrg -Name myvm -Force          # deallocate
Stop-AzVM -ResourceGroupName myrg -Name myvm -StayProvisioned  # stopped, payé

Get-AzVM -ResourceGroupName myrg -Status

Storage

$ctx = (Get-AzStorageAccount -ResourceGroupName myrg -Name mysa).Context
New-AzStorageContainer -Name mycontainer -Context $ctx -Permission Off
Set-AzStorageBlobContent -File ./file.txt -Container mycontainer -Blob file.txt -Context $ctx
Get-AzStorageBlob -Container mycontainer -Context $ctx

Networking

$vnet = New-AzVirtualNetwork -ResourceGroupName myrg -Name myvnet -Location eastus -AddressPrefix 10.0.0.0/16
Add-AzVirtualNetworkSubnetConfig -Name mysubnet -AddressPrefix 10.0.1.0/24 -VirtualNetwork $vnet
$vnet | Set-AzVirtualNetwork

New-AzNetworkSecurityGroup -ResourceGroupName myrg -Name mynsg -Location eastus

RBAC

New-AzRoleAssignment -SignInName [email protected] -RoleDefinitionName "Reader" -ResourceGroupName myrg
Get-AzRoleAssignment -Scope /subscriptions/<sub>
Remove-AzRoleAssignment -SignInName [email protected] -RoleDefinitionName "Reader" -ResourceGroupName myrg

# Custom role — récupérer un built-in en JSON pour le cloner/customiser
Get-AzRoleDefinition -Name "Contributor" | ConvertTo-Json > customrole.json
# Éditer customrole.json (Actions/NotActions/AssignableScopes) puis :
New-AzRoleDefinition -InputFile ./customrole.json

Bicep / ARM deployment

New-AzResourceGroupDeployment -ResourceGroupName myrg -TemplateFile main.bicep -TemplateParameterFile params.json
Test-AzResourceGroupDeployment -ResourceGroupName myrg -TemplateFile main.bicep    # validate
Get-AzResourceGroupDeployment -ResourceGroupName myrg

# Sub-level
New-AzSubscriptionDeployment -Location eastus -TemplateFile sub.bicep

Key Vault

New-AzKeyVault -ResourceGroupName myrg -Name myvault -Location eastus -EnableRbacAuthorization
Set-AzKeyVaultSecret -VaultName myvault -Name mysecret -SecretValue (ConvertTo-SecureString "secret" -AsPlainText -Force)
Get-AzKeyVaultSecret -VaultName myvault -Name mysecret -AsPlainText

C. Microsoft Graph PowerShell (Entra ID)

Remplace AzureAD et MSOnline (deprecated). Module : Microsoft.Graph.

Connect-MgGraph -Scopes "User.ReadWrite.All", "Group.ReadWrite.All"

# Users
Get-MgUser -Filter "department eq 'IT'"
New-MgUser -DisplayName "Jane Doe" -UserPrincipalName "[email protected]" -AccountEnabled -MailNickname jane -PasswordProfile @{Password="..."}

# Groups
Get-MgGroup -Filter "displayName eq 'Sales'"
New-MgGroup -DisplayName "Sales" -SecurityEnabled -MailEnabled:$false -MailNickname sales

# Add user to group
$user = Get-MgUser -Filter "userPrincipalName eq '[email protected]'"
$group = Get-MgGroup -Filter "displayName eq 'Sales'"
New-MgGroupMember -GroupId $group.Id -DirectoryObjectId $user.Id

D. AzCopy

CLI dédiée transferts massifs blob/file. Auth = azcopy login (Entra) ou SAS.

# Login (Entra)
azcopy login

# Upload file → blob
azcopy copy "./file.txt" "https://mysa.blob.core.windows.net/mycontainer/"

# Upload folder recursively
azcopy copy "./localfolder" "https://mysa.blob.core.windows.net/mycontainer/" --recursive

# Download blob → local
azcopy copy "https://mysa.blob.core.windows.net/mycontainer/file.txt" "./file.txt"

# Container → container (server-side)
azcopy copy "https://src.blob.core.windows.net/c1?<SAS>" "https://dst.blob.core.windows.net/c2?<SAS>" --recursive

# Sync (bidirectionnel)
azcopy sync "./localfolder" "https://mysa.blob.core.windows.net/mycontainer/" --recursive

# File share
azcopy copy "./folder" "https://mysa.file.core.windows.net/myshare/?<SAS>" --recursive

# List
azcopy list "https://mysa.blob.core.windows.net/mycontainer/"

# Avec SAS au lieu d'Entra (pratique scripts)
azcopy copy "./file.txt" "https://mysa.blob.core.windows.net/mycontainer/?<SAS-TOKEN>"

E. kubectl (AKS)

# Récupérer kubeconfig (après az aks get-credentials)
kubectl config current-context
kubectl config use-context myaks

# Cluster info
kubectl get nodes
kubectl get namespaces
kubectl cluster-info

# Pods / Services
kubectl get pods -A                          # all namespaces
kubectl get pods -n mynamespace
kubectl describe pod mypod -n mynamespace
kubectl logs mypod -n mynamespace
kubectl exec -it mypod -n mynamespace -- /bin/sh

# Deploy
kubectl apply -f deployment.yaml
kubectl delete -f deployment.yaml
kubectl rollout status deployment/myapp
kubectl rollout undo deployment/myapp

# Scale
kubectl scale deployment myapp --replicas=5

# Services / Ingress
kubectl get svc
kubectl get ingress

F. Sysprep / Waagent (généraliser une VM avant capture)

Windows

REM Avant : supprimer C:\Windows\Panther si présent
C:\Windows\System32\Sysprep\sysprep.exe /generalize /oobe /shutdown
  • Generalize : retire SID + creds machine
  • OOBE : prochain boot lance l'assistant initial
  • Shutdown : arrête après → la VM est prête à capturer

Linux

sudo waagent -deprovision+user
# Le +user supprime aussi les comptes user créés (pas juste l'agent Linux)
sudo shutdown now

G. Bicep — exemple type

@description('Region de déploiement')
param location string = resourceGroup().location

@description('Nom du Storage Account (3-24 chars, lowercase)')
@minLength(3)
@maxLength(24)
param saName string

@allowed(['Standard_LRS', 'Standard_GRS', 'Standard_ZRS'])
param sku string = 'Standard_LRS'

resource sa 'Microsoft.Storage/storageAccounts@2023-01-01' = {
  name: saName
  location: location
  sku: { name: sku }
  kind: 'StorageV2'
  properties: {
    minimumTlsVersion: 'TLS1_2'
    supportsHttpsTrafficOnly: true
    allowBlobPublicAccess: false
  }
}

output saId string = sa.id
output saEndpoint string = sa.properties.primaryEndpoints.blob

Déploiement :

az deployment group create -g myrg --template-file main.bicep --parameters saName=mysa123

H. Azure Cloud Shell — outils dispos

Outils pré-installés dans Cloud Shell (pas besoin d'install) :

  • az (CLI), Az PowerShell module
  • bicep, terraform
  • kubectl, helm
  • azcopy
  • git, python, node, dotnet
  • Editor : code (Monaco editor)
  • Storage $HOME/clouddrive (5 GB, persistant via Azure Files)

I. Misc — commandes utiles spécifiques exam

MARS / Backup

# Backup MARS vers RSV
Set-OBPolicy -Policy $newpolicy
Backup-OBPolicy -Policy (Get-OBPolicy)

File Sync

# Forcer sync cloud → server
Invoke-AzStorageSyncChangeDetection -StorageSyncServiceName mysync -SyncGroupName mysg -ServerEndpointId <id>

Encryption at Host (register feature)

az feature register --namespace Microsoft.Compute --name EncryptionAtHost
az feature show --namespace Microsoft.Compute --name EncryptionAtHost
az provider register --namespace Microsoft.Compute

Trigger Policy compliance scan

az policy state trigger-scan --resource-group myrg

VM File Recovery (Backup)

# Le portail génère un script qui mount les disks du recovery point comme drives
# Tu downloades + execute le script PowerShell → drives apparaissent → copie fichiers → unmount

PARTIE 3 — Quick wins exam

⚡ À mémoriser

Limites par défaut

  • Subnet réservé : 5 IPs
  • Tags : 50 par ressource
  • Diagnostic settings : 5 par ressource
  • Action group : 1 → N alertes (réutilisable)
  • App Service slots : Standard 5, Premium 20, Isolated 20
  • AS : FD max 3, UD max 20
  • Soft-delete RSV : 14j default (14-180j)
  • Soft-delete blob : 7j default (1-365j)

Subnets nommés (obligatoires, exact spelling)

  • GatewaySubnet (/27 min)
  • AzureBastionSubnet (/26 min)
  • AzureFirewallSubnet (/26 min)
  • RouteServerSubnet (/27 min)
  • AzureFirewallManagementSubnet (forced tunneling)

Subnets délégués (à connaître)

  • App Service VNet integration → Microsoft.Web/serverFarms
  • Azure NetApp Files → Microsoft.NetApp/volumes
  • Azure DNS Private Resolver → Microsoft.Network/dnsResolvers
  • ACI → Microsoft.ContainerInstance/containerGroups

Ports à connaître

  • 443 : HTTPS, Hybrid Connections, App Proxy
  • 3389 : RDP
  • 22 : SSH
  • 80 : HTTP
  • 1433 : SQL
  • 5671/5672 : AMQP (Service Bus)
  • 9354 : Service Bus Relay (legacy)

Outils Network Watcher → quel use case

Outil Use case
IP Flow Verify NSG bloque-t-il ce flux ?
Next Hop Où va vraiment ce trafic (UDR debug) ?
Connection Troubleshoot Test bout-en-bout one-shot
Connection Monitor Surveillance continue
Packet Capture Capture pcap distante
NSG Diagnostic Toutes les règles s'appliquant à une NIC
VPN Troubleshoot Diagnostic VPN GW

Workflow réflexes

  • VM ne démarre pas → Boot diagnostics screenshot/serial log
  • Pas de réseau VM → Serial console
  • Connexion bloquée → IP Flow Verify
  • Apps lentes → VM Insights / Application Insights
  • DR cross-region → ASR (pas Backup)
  • App on-prem en internet sans VPN → Application Proxy
  • App Azure → DB privée dans VNet → VNet Integration
  • App Azure → 1 host on-prem précis → Hybrid Connections
  • Onboarding identité externe → B2B Collaboration
  • Trust org-to-org Teams → B2B Direct Connect
  • Customers grand public → External ID for Customers (ex B2C)