Cloud

Azure App Service slots : valider un swap avant promotion en production

Un runbook de production pour qualifier un swap Azure App Service avec dérive de configuration, warmup, identité, dépendances, logs, validation et rollback avant promotion.

30 juin 2026 azureapp-servicedeployment-slotsswapdevopsobservabilitykqlautomationrunbookrollback

Un swap de slot App Service donne l’impression d’un mécanisme de release propre : déployer en staging, chauffer l’application, puis échanger le trafic avec la production. En pratique, le swap peut déplacer une mauvaise configuration, exposer une dépendance valable seulement en staging, casser un accès par identité managée, vider des caches ou masquer une régression derrière un rollback rapide.

Le cas d’usage est un site ou une API de production hébergé sur Azure App Service. Une nouvelle version vient d’être déployée dans un slot de staging et l’équipe s’apprête à la promouvoir. L’objectif du runbook est de décider s’il faut swapper, attendre, corriger la configuration ou revenir au slot de production courant avec assez de preuves pour expliquer la décision après coup.

Figer le contrat de release

Avant de toucher au bouton de swap, décrire ce qui doit rester stable. Un swap modifie le routage, mais le vrai risque porte sur le contrat autour des settings, des identités, des dépendances et des probes.

text slot-swap-release-contract.txt
Release a qualifier
Nom de l'App Service et resource group
Slot source : staging
Slot cible : production
Version de build ou d'image conteneur
Run de pipeline de deploiement
Hostname public et domaines custom attendus
Dependances attendues : base, storage, API, queue, cache
Fenetre de changement et responsable rollback

Controles a prouver
Les slot settings sont correctement marques
Les secrets production-only ne partent pas en staging
Les diagnostics staging-only ne partent pas en production
L'identite managee et les RBAC sont valides pour les dependances cible
Les health probes passent par le meme chemin d'ingress que les utilisateurs
Le rollback par swap inverse est teste et documente

Ce contrat évite une confusion fréquente : une URL de staging verte ne prouve pas que l’application se comportera correctement une fois devenue production.

Comparer les settings avant le swap

Les slot settings décident quelles valeurs restent attachées au slot et quelles valeurs bougent pendant le swap. Un seul mauvais flag peut promouvoir une chaîne de connexion de staging ou laisser en production un feature flag prévu uniquement pour la validation.

bash 01-compare-slot-settings.sh
APP_NAME="app-prod"
RESOURCE_GROUP="rg-app-prod"
SOURCE_SLOT="staging"
TARGET_SLOT="production"

az webapp config appsettings list --name "$APP_NAME" --resource-group "$RESOURCE_GROUP" --slot "$SOURCE_SLOT" --output json > appsettings-staging.json

az webapp config appsettings list --name "$APP_NAME" --resource-group "$RESOURCE_GROUP" --output json > appsettings-production.json

jq -r '.[] | [.name, .slotSetting, (.value | tostring | length)] | @tsv' appsettings-staging.json | sort > staging-settings.tsv
jq -r '.[] | [.name, .slotSetting, (.value | tostring | length)] | @tsv' appsettings-production.json | sort > production-settings.tsv

diff -u production-settings.tsv staging-settings.tsv || true

Le diff ne doit pas exposer les valeurs de secrets. Il doit exposer les noms, les flags de slot et la présence d’une valeur. Si DATABASE_URL, KeyVaultName, Feature__WriteMode ou APPLICATIONINSIGHTS_CONNECTION_STRING diffèrent, il faut décider si l’écart est attendu et s’il doit rester attaché au slot.

Chauffer le candidat par le vrai chemin

Un endpoint de warmup qui vérifie seulement que le process répond ne suffit pas. Le slot de staging doit prouver qu’il sait démarrer, charger sa configuration, joindre ses dépendances et répondre utilement par le même chemin gateway, DNS et TLS que la production.

bash 02-slot-warmup-probes.sh
STAGING_HOST="app-prod-staging.azurewebsites.net"
PROD_HOST="app.example.com"
CORRELATION_ID="swap-$(date +%Y%m%d%H%M%S)"

curl -sS -D staging-headers.txt -H "x-correlation-id: $CORRELATION_ID" "https://$STAGING_HOST/health/ready"

curl -sS -D production-headers.txt -H "x-correlation-id: $CORRELATION_ID-before" "https://$PROD_HOST/health/ready"

La probe doit être représentative mais bornée. Elle peut vérifier une lecture base de données, la connexion cache, les métadonnées d’une queue, le chargement des feature flags et l’obtention d’un token par identité. Elle ne doit pas écrire de données production depuis staging sauf si l’action est explicitement sûre.

Valider identité et dépendances

Un swap ne corrige pas magiquement l’identité. L’application peut utiliser une identité system-assigned, une identité user-assigned, des références Key Vault, Storage, SQL ou des API privées. Le slot candidat doit prouver que l’identité runtime après promotion sera bien celle attendue.

text identity-dependency-checklist.txt
Controle avant swap
Identite managee activee sur l'app de production et le slot attendu
Client ID de l'identite user-assigned stable
References Key Vault resolues dans le slot source
Acces base ou API teste avec l'identite applicative
Dependances privees jointes par le chemin VNet Integration attendu
Feature flags n'activant pas les chemins d'ecriture avant promotion

Suspendre le swap quand
Staging fonctionne seulement avec une identite de test plus large
Les references Key Vault sont non resolues ou stale
L'acces dependance reussit depuis staging mais pas par le chemin production
La nouvelle version demande un role qui n'a pas encore propage

Si le candidat nécessite un nouveau rôle, il faut qualifier ce changement séparément. Ne cachez pas une modification d’identité dans un swap de slot.

Lire les logs comme preuves de release

La décision de swap doit s’appuyer sur les logs avant et après promotion. Garder ensemble le run de pipeline, le nom du slot, la version de build et les identifiants de corrélation.

kusto 03-app-service-swap-validation.kql
let Window = 2h;
let CorrelationPrefix = "swap-";
AppServiceHTTPLogs
| where TimeGenerated > ago(Window)
| where CsUriStem has "/health" or CsUserAgent has "swap-probe"
| project TimeGenerated,
        Host = CsHost,
        Uri = CsUriStem,
        Status = ScStatus,
        TimeTaken,
        UserAgent = CsUserAgent
| order by TimeGenerated desc

Si Application Insights est utilisé, corréler les requêtes, dépendances et exceptions avec le même marqueur de release. Un statut HTTP vert avec des dépendances en échec n’est pas une release verte.

Décider swap, attente ou rollback

La décision doit être écrite avant que l’équipe soit sous pression. La matrice ci-dessous garde l’action limitée.

text slot-swap-decision-matrix.txt
Swapper
Diff de settings relu
Slot settings corrects
Warmup vert par le chemin prevu
Identite et dependances validees
Logs sans nouvelle exception critique
Responsable et commande de rollback prets

Attendre
Derive de configuration non expliquee
Health check trop superficiel
Acces dependance via une identite de test
RBAC ou DNS requis encore en propagation
Observabilite insuffisante pour prouver le comportement candidat

Rollback apres swap
Probes production en echec apres promotion
Taux d'erreur ou echecs dependances en hausse sur la nouvelle version
Feature flag declenchant des ecritures inattendues
Parcours client en regression et correction locale plus risquee qu'un retour arriere

Un rollback par swap inverse n’est pas un échec du processus. C’est la raison pour laquelle ce chemin de release existe. Le point important est de savoir quelles preuves le déclenchent.

Exécuter et valider le swap

Exécuter le swap avec une source et une cible explicites, puis rejouer immédiatement les mêmes probes. Éviter de modifier plusieurs contrôles sans rapport pendant la même fenêtre.

bash 04-execute-and-validate-swap.sh
APP_NAME="app-prod"
RESOURCE_GROUP="rg-app-prod"
SOURCE_SLOT="staging"
TARGET_SLOT="production"
CORRELATION_ID="swap-$(date +%Y%m%d%H%M%S)"

az webapp deployment slot swap --name "$APP_NAME" --resource-group "$RESOURCE_GROUP" --slot "$SOURCE_SLOT" --target-slot "$TARGET_SLOT"

curl -sS -D after-swap-headers.txt -H "x-correlation-id: $CORRELATION_ID-after" "https://app.example.com/health/ready"

Conserver les sorties de probes avant et après avec le ticket de déploiement. Si le rollback est nécessaire, utiliser la même commande de swap en sens inverse et rejouer les probes.

Conclusion

Les slots App Service sont utiles quand ils sont traités comme un chemin de release exploitable, pas comme un raccourci autour de la validation de production. Une décision de swap saine sépare configuration, flags de slot, warmup, identité, dépendances, logs et rollback.

Le meilleur résultat n’est pas seulement que le swap réussisse. C’est que l’équipe puisse expliquer pourquoi la promotion était sûre, ce qui a été validé après promotion et à quel moment exact un rollback aurait été déclenché.