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 Locationdéfinie sur l'user → erreurlicenseAssignmentNotAllowed. - 💡 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 :
OwnerouUser Access Adminrequis pour créer. - Custom Entra Role : P1 requis +
Global AdminouPrivileged Role Admin. - 🚨 Policy least-privilege :
Resource Policy Contributor(créer/assigner Policy) ≠Contributorplein. Pareil :Cost Management Contributor(FinOps),Reservation Administrator(RIs). - Cloud Device Administrator = gère devices Entra + BitLocker, PAS les groupes (≠ User Admin).
Authentification
- Security Defaults ↔ Conditional 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é
- Stopped (depuis l'OS,
- 🚨 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 + quotasavant 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,/27minimum. - 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).
Contributor≠Storage 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:\bdu 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,
/27minimum. - 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é,
/27minimum.
DNS
- Private DNS Zone auto-registration = 1 seul VNet par zone peut l'avoir.
- Zones Private Endpoint :
privatelink.<service>(exprivatelink.blob.core.windows.net). - Azure DNS Private Resolver = subnet délégué
Microsoft.Network/dnsResolvers,/28minimum. - 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.
Contributorne peut PAS modifier les locks → besoinMicrosoft.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(anciennementAzureRM, 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
AzureADetMSOnline(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),AzPowerShell modulebicep,terraformkubectl,helmazcopygit,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)