Skip to main content

Learn how to use Azure Chaos Studio to simulate data center outages, test Azure OpenAI failover, and validate AI app resiliency using KQL and CLI workflows

Resiliency TestingChaos StudioZone DownAzure OpenAI Failover

Testing AI Resiliency: Using Azure Chaos Studio to
Simulate Data Center Outages on Your LLM

Every multi-region Azure OpenAI architecture diagram has a failover arrow drawn on it. Almost none of them have ever actually been triggered. The arrow is a hypothesis, confirmed only by a real outage — unless you deliberately cause a controlled one first, on your own schedule, with a rollback plan, instead of finding out during an incident that the failover you designed never quite worked the way the diagram promised.

The failure signature this guide resolves
# The gap this article closes — a real architecture review finding:

  Design doc, page 4: "In the event of a regional outage, Azure Front
  Door automatically routes traffic to the secondary Azure OpenAI
  deployment in West Europe, with an expected failover time under
  60 seconds."

  Verification performed to support this claim: NONE.
  Last time this path was actually exercised:      NEVER.

# What actually happens when someone finally tests it, six months
# after the design doc was approved:

$ az rest --method post \
    --url ".../providers/Microsoft.Chaos/experiments/zone-down-eastus/start?api-version=2023-11-01"

# Zone 1 of East US goes down as designed. But:
- The Front Door health probe interval was left at its 30s default,
  tuned for a DIFFERENT service, never revisited for this one.
- The APIM retry policy retries against the SAME unhealthy region
  three times before falling through - adding 90s of latency nobody
  budgeted for.
- The secondary region's Azure OpenAI deployment has a DIFFERENT
  model version than primary - responses subtly change shape mid-
  failover, breaking a downstream JSON parser that assumed one schema.

Actual failover time observed:      4 minutes 40 seconds
Design doc's claimed failover time: under 60 seconds
Gap between assumption and reality: 4x, discovered in a test window,
                                     not during a real customer-facing
                                     regional outage.

Symptom: A documented multi-region failover strategy for Azure OpenAI has never been exercised end-to-end, so its actual recovery time, health-probe behaviour, and model-version consistency across regions are assumptions rather than measurements.  Failure point: Resiliency was designed once and never validated again — no regular, automated, controlled fault injection confirms the failover path still works as configuration, retry policies, and deployments drift over time.  Default platform behaviour: Azure does not test your failover for you. A multi-region architecture with untested failover is, functionally, a single-region architecture with an unverified backup plan.

No "setup" verb
There is no single az chaos setup command. Targets, capabilities, and experiments are three separate calls via az rest
Zone ≠ Region
Chaos Studio's native "Zone Down" fault tests an availability-zone failure within a region — not a full regional outage. The distinction changes what you're actually proving
Not a direct target
Azure OpenAI / Cognitive Services is not itself a Chaos Studio fault target. You fault the network path or compute tier calling it, not the resource
Workspaces (preview)
A curated "Zone Down" scenario template now exists in Chaos Studio Workspaces — public preview, GA targeted late 2026

A failover architecture that has never failed over is a diagram, not a system property. Azure Chaos Studio exists to close exactly this gap — deliberately, safely, and on a schedule you control, rather than during an actual outage where the stakes, the pressure, and the blast radius are all real. But the brief's framing of a single az chaos setup command doesn't match how Chaos Studio's CLI workflow actually works, and "Zone Down" is a more specific test than "simulate a data center outage" makes it sound. Both of those gaps matter, because getting them wrong produces a chaos experiment that runs successfully, produces a green checkmark, and proves almost nothing about whether your Azure OpenAI application would actually survive the failure you meant to test. This article builds the real thing: the actual CLI mechanics, the precise fault that matches "zone" versus the fault that matches "region," and the network-level test that's necessary because Azure OpenAI itself can't be directly targeted.

Figure 1 — What "Zone Down" actually tests vs what a design doc usually means by "data center outage"
ONE AZURE REGION CONTAINS MULTIPLE AVAILABILITY ZONES — the fault you run must match the failure you're modelingEAST US (one Azure region)Zone 1VMSS + AOAI✗ DOWN in testZone 2VMSS + AOAI✓ still upZone 3VMSS + AOAI✓ still upCHAOS STUDIO "ZONE DOWN" TESTS THIS —one zone fails, traffic shifts WITHIN the regionNative VMSS Shutdown 2.0 fault, zone-filteredWEST EUROPE (secondary region)This region is UNAFFECTED byZone Down in East US.To actually prove Front Door reroutesHERE, you must fail ALL of East US'szones simultaneously, OR simulate fullregional unreachability at the networklayer (Section 7) — a DIFFERENT fault.THE CORRECTION: "Zone Down" and "simulate a data center outage that forcescross-REGION failover" are two different tests. Running the built-in Zone Downscenario against one zone proves cross-zone resilience WITHIN a region — realand valuable, but it will NEVER trigger your Front Door secondary-region routing,because the other two zones absorb the load before Front Door ever sees a problem.
A region typically contains three availability zones. Chaos Studio's native Zone Down fault takes down one zone at a time — the traffic that zone was serving shifts to the region's remaining healthy zones, and Azure Front Door never sees the region itself as unhealthy. To actually validate cross-region Azure OpenAI failover, you need either all zones of a region down simultaneously, or a network-level fault that makes the whole region unreachable — a different, larger blast-radius test than the single-zone scenario most teams run first.
01"az chaos setup" Doesn't Exist — What the CLI Workflow Actually IsCorrection

Every official Microsoft tutorial for Azure Chaos Studio's CLI workflow — service-direct faults, agent-based faults, dynamic zone targeting, AKS Chaos Mesh faults — uses the same underlying mechanism, and it isn't a dedicated az chaos command tree with a setup verb. It's az rest, calling the Microsoft.Chaos resource provider's REST API directly, in three distinct steps that Chaos Studio treats as separate resources.

StepWhat it doesActual mechanism
1. Create a targetRegisters a resource (VMSS, AKS cluster, Cosmos DB, etc.) as something Chaos Studio is allowed to touchaz rest --method put against .../providers/Microsoft.Chaos/targets/{targetType}
2. Enable capabilitiesSpecifies which faults are permitted against that target — shutdown, CPU pressure, network delay, etc.az rest --method put against .../targets/{targetType}/capabilities/{capability}
3. Create & run an experimentDefines the sequence of faults, targets, and durations; creates a system-assigned managed identity; starts executionaz rest --method put for the experiment resource, then az rest --method post to .../experiments/{name}/start

There is no single command that does all three at once — the brief's az chaos setup framing describes an intent (get chaos testing running quickly) rather than a real command that exists in the documented, GA CLI workflow. Every one of Microsoft's own tutorials — service-direct faults, agent-based faults, dynamic zone targeting — is built from these same three az rest calls, composed differently depending on the resource type and fault.

A curated "Zone Down" scenario now exists — but it's a portal feature, in preview

Microsoft has recently introduced Chaos Studio Workspaces (public preview at time of writing, GA targeted late 2026), which ships pre-built scenario templates — including one literally named Zone Down — that compose the right faults automatically so you don't have to hand-assemble the JSON. It's a genuinely closer match to what the brief describes as a turnkey setup experience. As of this writing, Workspaces is a portal-driven experience (with a drag-and-drop Scenario Designer); the underlying automation for CI/CD pipelines still goes through the same az rest / REST API mechanism this article builds. If you have Workspaces access, use it to explore and validate a scenario interactively — then automate the underlying experiment definition it produces using the CLI pattern in Section 8.

Prerequisites the CLI workflow assumes

Azure CLI version 2.0.30 or later. The Microsoft.Chaos resource provider registered on your subscription. And — easy to miss — every experiment gets its own system-assigned managed identity, created automatically when the experiment resource is created, which must then be granted an appropriate role (e.g. Virtual Machine Contributor for VMSS shutdown) on every target resource before the experiment can actually run. Skipping this step is the single most common reason a first chaos experiment fails with a permissions error rather than actually injecting the fault.

02Zone Down vs Region Down: The Distinction That Changes Your TestCorrection

An Azure region — East US, West Europe — is typically composed of multiple physically separate availability zones, each with independent power, cooling, and networking. "Zone Down" in Chaos Studio's fault library means exactly what it says: one availability zone's compute instances are shut down, while the region's other zones keep serving traffic. This is a real, valuable test — but it is not the same test as "simulate the data center that hosts my primary Azure OpenAI deployment going dark," which is what most people mean when they say "simulate a data center outage."

What you runWhat it actually provesDoes it trigger cross-region failover?
Zone Down (one zone)Your compute layer survives losing 1 of N zones within a regionNo — the region's other zones absorb the load. Front Door never sees a problem
Zone Down (all zones, simultaneously)Your compute layer, taken down entirely within a region, correctly triggers upstream failoverCloser, but still doesn't test the network path itself being unreachable
Network-level regional block (Section 7)Front Door / APIM behavior when the ENTIRE region — including its Azure OpenAI endpoint — is unreachableYes — this is the test that actually exercises your documented failover path
Currently only one fault supports dynamic zone targeting

As of this writing, dynamic targeting by availability zone is supported specifically by the Virtual Machine Scale Sets Shutdown 2.0 fault, and only for VMSS using Uniform orchestration mode (Flexible orchestration uses a different, ARM-based VM shutdown fault instead). If your compute tier calling Azure OpenAI runs on something else — Container Apps, AKS, App Service — the zone-down pattern doesn't apply directly the same way, and you'll want the network-level approach in Section 7 regardless of your compute platform, since it tests the thing that actually matters for AI workloads: whether the AOAI endpoint itself is reachable.

This distinction is the whole point of the brief, done honestly

The brief asks for a test that confirms AI apps "dynamically reroute to secondary geographic regions." Read literally, the native single-zone Zone Down scenario cannot prove that — it's testing a smaller, real, but different failure mode. Being precise about this distinction is not pedantry; a team that runs Zone Down, sees green, and concludes their cross-region Azure OpenAI failover works has validated the wrong thing and will find out the hard way during an actual regional incident. Section 7 builds the test that actually answers the brief's question.

03Why Azure OpenAI Isn't a Direct Chaos Studio TargetCorrection

Chaos Studio's fault library covers a wide range of Azure resource types — Virtual Machines, VM Scale Sets, AKS, Cosmos DB, Cache for Redis, Event Hubs, Key Vault, Service Bus, network security groups, and more. Azure OpenAI (Cognitive Services accounts) is not among the resource types with a native Chaos Studio fault. There is no Microsoft-CognitiveServices target type you can enable and inject a "make this endpoint unavailable" fault against directly.

This isn't a gap in Chaos Studio's coverage so much as a reflection of what you actually need to test. You don't control Azure OpenAI's own internal availability — that's Microsoft's operational responsibility, backed by the service's own SLA. What you do control, and what actually determines whether your application survives a regional AOAI outage, is everything around it: whether your compute tier notices the primary endpoint is unreachable, whether your retry and circuit-breaker logic behaves correctly, and whether Front Door or APIM actually reroutes to the secondary region's deployment. That's the thing worth chaos-testing — not the AOAI resource itself, but your application's response to it becoming unreachable.

What you're actually testingHow to simulate it
Primary AOAI endpoint unreachableNSG rule blocking outbound traffic to the primary AOAI endpoint's IP range, or a DNS Outage fault against the resolver path
Compute tier hosting your app diesVMSS Shutdown 2.0 (zone-scoped or full), Container Apps/AKS-appropriate faults
Front Door / APIM failover logicCombine the network block above with active traffic and watch which region actually serves responses
Downstream schema compatibility across regionsNot a chaos fault — a deployment-consistency check (Section 9's anti-patterns covers this)
Network security groups are the practical stand-in for "AOAI is down"

The NSG fault in Chaos Studio's library lets you inject a temporary deny rule that blocks traffic matching specified filters — and this is the closest native fault to "make this endpoint unreachable from my application's perspective" for a PaaS resource like Azure OpenAI that isn't itself a direct target. Point the block at the primary region's AOAI endpoint's resolved IP range, applied to the NSG governing your compute tier's outbound path, and your application experiences exactly what it would experience during a real regional outage: connection failures to the primary endpoint, with the secondary region still fully reachable.

Architectural Topology: Failing vs Remediated

LayerFailing configuration (current)Remediated configuration (fix)
Failover validationNever exercised — a diagram and an assumptionScheduled, automated chaos drills with measured outcomes
Fault scopeUndefined, or confused between "zone" and "region"Explicit: zone-scoped for cross-zone resilience, network-block for cross-region
AOAI-specific testingAssumed covered by "chaos testing" broadlyExplicitly tested via NSG block on the AOAI endpoint's network path
Autoscale interactionNot accounted for — autoscaler silently replaces killed instances mid-testDisable Autoscale fault runs in parallel, holding the failure state stable
Experiment permissionsNot granted, or granted too broadly (e.g. Contributor on the whole RG)Scoped role assignment per target resource, per experiment's managed identity
AutomationManual portal clicks, run once, forgottenCI/CD-triggered, scheduled recurrence, results tracked over time
Success criteria"Nothing crashed" (vague)Measured RTO against a documented target, zero user-visible 5xx, correct region served
Post-drill stateLeft in whatever state the fault left it — manual cleanup, if rememberedAutomatic experiment stop + rollback verification as part of the pipeline
05Fix 1 — Onboard Targets and CapabilitiesSetup

Before any fault can run, the resources involved need to be explicitly onboarded to Chaos Studio. For a Zone Down test against the compute tier fronting Azure OpenAI, that means the VMSS (or equivalent) and, if you use autoscale, the autoscale settings resource too.

Bash — onboard the VMSS as a service-direct target# Requires Azure CLI 2.0.30+. Set these once per session. SUBSCRIPTION_ID="00000000-0000-0000-0000-000000000000" RESOURCE_GROUP="rg-ai-prod-eastus" VMSS_NAME="vmss-aoai-frontend" VMSS_RESOURCE_ID="/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Compute/virtualMachineScaleSets/$VMSS_NAME" # 1. Create the target - registers the VMSS with Chaos Studio az rest --method put \ --url "https://management.azure.com/$VMSS_RESOURCE_ID/providers/Microsoft.Chaos/targets/Microsoft-VirtualMachineScaleSet?api-version=2023-11-01" \ --body "{\"properties\":{}}" # 2. Enable the shutdown capability - the only capability VMSS supports az rest --method put \ --url "https://management.azure.com/$VMSS_RESOURCE_ID/providers/Microsoft.Chaos/targets/Microsoft-VirtualMachineScaleSet/capabilities/Shutdown-2.0?api-version=2023-11-01" \ --body "{\"properties\":{}}"
Bash — onboard the Autoscale Settings resource (needed to hold the fault stable)AUTOSCALE_RESOURCE_ID="/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/microsoft.insights/autoscalesettings/autoscale-vmss-aoai-frontend" az rest --method put \ --url "https://management.azure.com/$AUTOSCALE_RESOURCE_ID/providers/Microsoft.Chaos/targets/Microsoft-AutoScaleSettings?api-version=2023-11-01" \ --body "{\"properties\":{}}" az rest --method put \ --url "https://management.azure.com/$AUTOSCALE_RESOURCE_ID/providers/Microsoft.Chaos/targets/Microsoft-AutoScaleSettings/capabilities/DisableAutoscale-1.0?api-version=2023-11-01" \ --body "{\"properties\":{}}"
Without disabling autoscale, your test measures the autoscaler, not your failover

If your VMSS uses an autoscale policy, killing instances in one zone triggers the autoscaler to provision replacements — often within the same test window. The result looks like a successful recovery, but what you actually measured is "how fast does autoscale replace a VM," not "does traffic correctly reroute to a healthy zone or region while capacity is down." Include the DisableAutoscale fault as a parallel branch in your experiment (Section 6) so the zone genuinely stays down for the full test duration.

Bash — verify what you onboarded, via Azure Resource Graphaz extension add --name resource-graph --only-show-errors 2>/dev/null az graph query -q " chaosresources | where type == 'microsoft.chaos/targets' | where resourceGroup =~ '$RESOURCE_GROUP' | project name, type, resourceGroup " # Confirms both targets exist before you spend time building the experiment.
06Fix 2 — Build the Zone-Down Experiment (With Autoscale Held Off)The Fix

The experiment definition is a JSON document with two parallel branches in one step: shut down the VMSS instances in the target zone, and simultaneously disable autoscale so nothing masks the effect. Dynamic targeting by zone is expressed through a filter parameter, unique to the VMSS Shutdown 2.0 fault.

experiment.json — Zone 1 down, autoscale held off, 10-minute duration{ "identity": { "type": "SystemAssigned" }, "location": "eastus", "properties": { "selectors": [ { "type": "List", "id": "vmssSelector", "targets": [ { "id": "$VMSS_RESOURCE_ID/providers/Microsoft.Chaos/targets/Microsoft-VirtualMachineScaleSet", "type": "ChaosTarget" } ] }, { "type": "List", "id": "autoscaleSelector", "targets": [ { "id": "$AUTOSCALE_RESOURCE_ID/providers/Microsoft.Chaos/targets/Microsoft-AutoScaleSettings", "type": "ChaosTarget" } ] } ], "steps": [ { "name": "Zone 1 Down", "branches": [ { "name": "Shut down Zone 1 instances", "actions": [ { "type": "continuous", "selectorId": "vmssSelector", "duration": "PT10M", "parameters": [ { "key": "filter", "value": "{\"type\":\"List\",\"zones\":[\"1\"]}" } ], "name": "urn:csci:microsoft:virtualMachineScaleSet:shutdown/2.0" } ] }, { "name": "Hold autoscale off", "actions": [ { "type": "continuous", "selectorId": "autoscaleSelector", "duration": "PT10M", "parameters": [], "name": "urn:csci:microsoft:autoScaleSettings:disableAutoscale/1.0" } ] } ] } ] } }
Bash — create the experiment, grant permissions, run it# 1. Create the experiment resource (also creates the system-assigned identity) az rest --method put \ --url "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Chaos/experiments/zone1-down-aoai-frontend?api-version=2023-11-01" \ --body @experiment.json # 2. Capture the experiment's managed identity principal ID from the response, # then grant it the roles it needs on EACH target resource. EXPERIMENT_PRINCIPAL_ID="<principalId from step 1's response>" az role assignment create \ --role "Virtual Machine Contributor" \ --assignee-object-id "$EXPERIMENT_PRINCIPAL_ID" \ --assignee-principal-type ServicePrincipal \ --scope "$VMSS_RESOURCE_ID" az role assignment create \ --role "Contributor" \ --assignee-object-id "$EXPERIMENT_PRINCIPAL_ID" \ --assignee-principal-type ServicePrincipal \ --scope "$AUTOSCALE_RESOURCE_ID" # 3. Start the experiment. Role propagation can take a few minutes - # if step 3 fails immediately with a permissions error, wait and retry. az rest --method post \ --url "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Chaos/experiments/zone1-down-aoai-frontend/start?api-version=2023-11-01"
Zone identifiers are strings, and they're logical, not physical, per subscription

The "zones":["1"] filter value refers to Azure's logical availability zone numbering, which — worth knowing — can map to different physical data centers for different subscriptions in the same region, by design, for load-distribution reasons across Azure's whole customer base. Confirm which logical zone your specific VMSS instances are actually deployed to (via az vmss list-instances and checking the zones property) before assuming "Zone 1" in your experiment corresponds to where you think your primary capacity lives.

07Fix 3 — Simulate Full Regional Unreachability for the AOAI PathThe Real Test

This is the test that actually answers the brief's question — the one that forces Front Door's cross-region routing to activate, because from your application's perspective, the entire primary region's Azure OpenAI endpoint has simply stopped responding. It uses the NSG fault, since Azure OpenAI itself can't be a direct Chaos Studio target.

Bash — onboard the NSG governing your compute tier's outbound pathNSG_RESOURCE_ID="/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Network/networkSecurityGroups/nsg-aoai-frontend-eastus" az rest --method put \ --url "https://management.azure.com/$NSG_RESOURCE_ID/providers/Microsoft.Chaos/targets/Microsoft-NetworkSecurityGroup?api-version=2023-11-01" \ --body "{\"properties\":{}}" az rest --method put \ --url "https://management.azure.com/$NSG_RESOURCE_ID/providers/Microsoft.Chaos/targets/Microsoft-NetworkSecurityGroup/capabilities/SecurityRule-1.0?api-version=2023-11-01" \ --body "{\"properties\":{}}"
experiment-region-block.json — block outbound traffic to the primary AOAI endpoint{ "identity": { "type": "SystemAssigned" }, "location": "eastus", "properties": { "selectors": [ { "type": "List", "id": "nsgSelector", "targets": [ { "id": "$NSG_RESOURCE_ID/providers/Microsoft.Chaos/targets/Microsoft-NetworkSecurityGroup", "type": "ChaosTarget" } ] } ], "steps": [ { "name": "Primary region AOAI unreachable", "branches": [ { "name": "Block outbound to primary AOAI endpoint", "actions": [ { "type": "continuous", "selectorId": "nsgSelector", "duration": "PT10M", "parameters": [ { "key": "securityRules", "value": "[{\"destinationAddresses\":[\"\"],\"destinationPortRanges\":[\"443\"],\"direction\":\"Outbound\",\"access\":\"Deny\",\"protocol\":\"Tcp\",\"priority\":100}]" } ], "name": "urn:csci:microsoft:networkSecurityGroup:securityRule/1.0" } ] } ] } ] } }
Resolve the AOAI endpoint's IP range before the test, and re-verify it periodically

Azure OpenAI's custom-subdomain endpoint resolves to IP addresses that can change — it's a managed PaaS service behind Azure's infrastructure, not a fixed IP you control. Resolve the current IPs immediately before running the experiment (dig +short your-aoai-resource.openai.azure.com or equivalent), and don't assume an IP range captured months ago is still accurate. If your NSG rule blocks the wrong (stale) IP range, the fault runs, reports success, and blocks nothing that matters — a false-positive "pass" that's worse than not testing at all, because it creates unearned confidence.

Run active traffic DURING the fault, not before or after

This experiment only produces useful evidence if your application is actively sending real (or synthetic load-test) requests to Azure OpenAI while the NSG block is active. An idle system with no traffic during the 10-minute window tells you nothing about failover behavior under load — start a load-test script or synthetic traffic generator against your production endpoint a minute or two before triggering the experiment, and keep it running through the full duration plus a recovery buffer afterward.

Figure 2 — What to watch, and when, during the regional-block experiment
TIMELINE — synthetic load running throughout; the NSG block starts at t=0t=0+30s+2 min+5 min+10 min (fault ends)t=0 — NSG block engages. Primary AOAI endpoint unreachable.WATCH: request error rate on primary region jumps to 100% almost immediately.+30s to +2min — Front Door health probes detect primary unhealthy.WATCH: time until Front Door origin health status flips. THIS is your measured RTO.+2min to +10min — Traffic served from secondary region.WATCH: user-visible error rate returns to baseline. Response SHAPE stays consistent (model version match).+10min — Fault ends, NSG rule removed automatically. Traffic can return to primary.WATCH: does traffic FAIL BACK cleanly, or does it get stuck on secondary until manually reset?The gap between "primary unreachable" and "secondary serving cleanly" is the number your design doc claimed. Measure it, don't assume it.
Four things to watch, in sequence: how fast the failure is detected, how long failover actually takes (compare against your documented RTO), whether the secondary region serves correctly and consistently once active, and whether the system fails back cleanly once the fault ends. Missing the fail-back check is common and leaves you with an untested assumption in the opposite direction.
08Fix 4 — Automate the Drill in a PipelineOperationalize

A chaos experiment run once, manually, by one engineer, six months ago, has almost the same evidentiary value as a design doc's untested claim — it proves the system worked then, under that configuration. Configuration drifts: retry policies get tuned, model deployments change, NSG rules get modified for unrelated reasons. The fix is running this on a schedule, automatically, with results tracked over time.

Azure DevOps YAML — scheduled chaos drill with automatic start/monitor/stoptrigger: none schedules: - cron: "0 3 * * 0" # weekly, 3am Sunday - low-traffic window displayName: Weekly AOAI regional failover drill branches: include: [ main ] pool: vmImage: ubuntu-latest variables: SUB_ID: $(subscriptionId) RG_NAME: rg-ai-prod-eastus EXP_NAME: region-block-aoai-eastus stages: - stage: chaos_drill displayName: AOAI Regional Failover Drill jobs: - job: run_and_monitor steps: - task: AzureCLI@2 displayName: Start synthetic load generator inputs: azureSubscription: 'chaos-testing-sp' scriptType: 'bash' scriptLocation: 'inlineScript' inlineScript: | nohup python3 scripts/synthetic_aoai_load.py --duration 900 & - task: AzureCLI@2 displayName: Start chaos experiment inputs: azureSubscription: 'chaos-testing-sp' scriptType: 'bash' scriptLocation: 'inlineScript' inlineScript: | az rest --method post --url \ "https://management.azure.com/subscriptions/$(SUB_ID)/resourceGroups/$(RG_NAME)/providers/Microsoft.Chaos/experiments/$(EXP_NAME)/start?api-version=2023-11-01" - task: AzureCLI@2 displayName: Poll for completion, capture RTO metrics inputs: azureSubscription: 'chaos-testing-sp' scriptType: 'bash' scriptLocation: 'inlineScript' inlineScript: | python3 scripts/measure_failover_rto.py \ --front-door-name afd-aoai-hybrid \ --expected-rto-seconds 60 \ --output results/rto-$(Build.BuildNumber).json - task: PublishBuildArtifacts@1 inputs: PathtoPublish: 'results/' ArtifactName: 'chaos-drill-results'
Track RTO as a metric over time, not a one-off log line

The value of automating this drill compounds only if results are tracked and compared across runs. Publish each drill's measured failover time to a dashboard or a time-series store alongside your documented RTO target, so a gradual regression — failover creeping from 45 seconds to 90 seconds over several months as configuration drifts — is visible as a trend, not discovered the next time someone happens to glance at a single run's logs.

Schedule drills in a low-traffic window, and alert your on-call team beforehand

This is a deliberately destructive test running against production infrastructure. Schedule it during genuinely low-traffic periods, and make sure whoever is on-call knows a chaos drill is about to run — an on-call engineer paged by alerts from a chaos experiment they didn't know was happening is a bad outcome even if the system behaves exactly as designed. The experiment proving resilience and the humans monitoring it having a stressful surprise are not mutually exclusive; avoid both problems with a simple heads-up notification as part of the pipeline.

09Anti-Patterns: Chaos Testing That Proves NothingTraps

Chaos experiments are easy to run and easy to run badly — producing a green checkmark that feels like validation while actually testing the wrong thing, or testing nothing at all.

Anti-patternWhy it feels rightWhy it isn't
Run Zone Down, call cross-region failover "tested""We ran a chaos experiment, it's done"Single-zone failure never triggers cross-region routing — the region's other zones absorb it. You've tested a different, smaller claim
Run the experiment with no active traffic"Simpler to set up, fewer variables"An idle system can't demonstrate failover-under-load behavior — retry storms, connection pool exhaustion, and health-probe timing all depend on real traffic patterns
Forget to disable autoscale"One less thing to configure"You end up measuring how fast the autoscaler replaces killed instances, not whether failover actually engaged
Skip the fail-back check"The failover worked, test complete"A system stuck permanently on the secondary region after the fault clears is its own incident — verify recovery, not just failure response
Assume secondary region has an identical model deployment"We deployed the same model everywhere"Model versions, quota, and even API version support can silently drift between regions over time. A chaos test that doesn't check response schema consistency across regions misses this class of bug entirely
Run once, treat it as permanently validated"We already proved this works"Configuration drifts continuously. An unautomated, unrepeated chaos test has a shelf life shorter than most teams assume

Validation & Verification: Confirm the Fix

The chaos experiment succeeding (running to completion without erroring) and your resiliency claim being validated are two different things. Confirm the second, explicitly.

Step 1 — Confirm the experiment actually ran and completedaz rest --method get \ --url "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Chaos/experiments/region-block-aoai-eastus/executions?api-version=2023-11-01" \ --query "value[0].properties.status" # PASS: "success" - all fault steps executed without an internal error. # NOTE: "success" here means the FAULT ran correctly, not that your # application handled it well. Those are separate questions.
Step 2 — Measure the ACTUAL RTO against your documented target// Azure Monitor Log Analytics - Front Door origin health transitions AzureDiagnostics | where Category == "FrontDoorHealthProbeLog" | where TimeGenerated between (datetime("2026-07-13T03:00:00Z") .. datetime("2026-07-13T03:15:00Z")) | where OriginName_s == "aoai-eastus-primary" | project TimeGenerated, HealthState_s, OriginName_s | order by TimeGenerated asc // Find the timestamp health flips to "Unhealthy", and the timestamp // the SECONDARY origin starts receiving traffic. The gap is your RTO. // PASS: measured RTO <= documented target (e.g. 60s). // FAIL: measured RTO > documented target - the design doc's claim was // wrong. Update the doc AND investigate why (probe interval too // slow? retry policy hammering the dead origin first?).
Step 3 — Confirm response schema consistency across regions during failover# Compare a sample of responses served from primary (before the fault) # against responses served from secondary (during the fault). python3 -c " import json before = json.load(open('results/primary-sample-response.json')) during = json.load(open('results/secondary-sample-response.json')) assert set(before.keys()) == set(during.keys()), 'RESPONSE SCHEMA DRIFTED ACROSS REGIONS' assert before.get('model') == during.get('model') or True, 'model version differs - confirm this is expected' print('Schema match:', set(before.keys()) == set(during.keys())) print('Primary model:', before.get('model')) print('Secondary model:', during.get('model')) " # PASS: same schema. Model version match is worth flagging even if it's # not a hard failure - anyone downstream should know if it differs.
Step 4 — Confirm clean fail-back once the fault ends# Wait for the fault duration to elapse (PT10M in this article's example) # plus a buffer, then confirm traffic has returned to primary. sleep 120 # buffer past the 10-min fault window curl -s "https://prod.contoso.com/openai/deployments/gpt-4o/chat/completions?api-version=2024-10-21" \ -H "api-key: $API_KEY" -d '{"messages":[{"role":"user","content":"ping"}],"max_tokens":5}' \ -D - -o /dev/null | grep -i "x-ms-region\|x-served-by" # PASS: response headers (or your own custom region-tagging header) # show traffic back on the PRIMARY region. # FAIL: still serving from secondary - investigate whether Front Door's # priority routing has a stickiness/cooldown setting keeping it # there longer than expected, and whether that's intentional.
What "fixed" actually means here

Four conditions must hold together. One: the experiment ran successfully at the platform level, confirmed via the execution status API, not assumed. Two: the measured recovery time is compared explicitly against your documented RTO claim, with a real number, not a vague "it seemed fast." Three: response consistency across regions during failover is checked, so an unnoticed model-version or schema drift doesn't quietly break downstream consumers the moment failover engages. Four: fail-back is verified after the fault clears, not just fail-over — a system stuck on the secondary region indefinitely is a second incident hiding behind a "successful" first one. Miss any of the four and the chaos experiment ran, but the resiliency claim it was meant to validate remains unproven.

Key Takeaways

There is no single "az chaos setup" command. The real workflow is three separate az rest calls — target, capability, experiment — against the Microsoft.Chaos resource provider.
Zone Down tests a smaller claim than "region down." A single-zone fault is absorbed by the region's other zones and never triggers Front Door's cross-region routing. Test the actual claim, not the closest built-in fault.
Azure OpenAI isn't a direct Chaos Studio target. Simulate its unreachability at the network layer — an NSG block on the resolved endpoint IP — since you're testing your app's response, not Microsoft's service availability.
Disable autoscale during the test, or you're measuring the wrong thing. An autoscaler quietly replacing killed instances makes a broken failover look like a working one.
Run active traffic during the fault. An idle system during a chaos experiment produces no evidence about behavior under real load — retry storms and health-probe timing only show up with traffic flowing.
Check fail-back, not just fail-over. A system stuck on the secondary region after the fault clears is a second incident hiding behind an apparently successful first test.
Automate and repeat — a one-time chaos test has a short shelf life. Configuration drifts continuously; only a scheduled, tracked drill catches the regression before a real outage does.

Frequently Asked Questions

Is there a single Azure CLI command to set up a chaos experiment?
No — despite how it's sometimes described, there is no az chaos setup command or equivalent single-command workflow in the documented, GA Azure CLI. Every official Microsoft tutorial for Chaos Studio's CLI-driven workflow — for service-direct faults, agent-based faults, and dynamic zone targeting alike — uses az rest to call the Microsoft.Chaos resource provider's REST API directly, in three separate steps: create a target, enable capabilities on that target, then create and start an experiment. A newer feature called Chaos Studio Workspaces (public preview, GA targeted late 2026) provides curated scenario templates including one named "Zone Down" through a portal-based Scenario Designer, which is closer to a turnkey experience — but the CLI/automation path for CI/CD pipelines still goes through the same underlying REST mechanism.
Does Chaos Studio's Zone Down fault test a full regional outage?
No, and this is a distinction worth being precise about. An Azure region typically contains multiple availability zones, each with independent power and networking. Chaos Studio's native Zone Down fault — built on the Virtual Machine Scale Sets Shutdown 2.0 fault with zone-based dynamic targeting — shuts down instances in one specified zone while the region's other zones continue serving traffic normally. Azure Front Door's health probes never see the region itself as unhealthy, because they're evaluating the region's overall availability, not each zone individually. To actually test a full regional outage that would trigger cross-region failover, you need either all zones of a region taken down simultaneously, or — more directly for testing an Azure OpenAI integration — a network-level fault that makes the entire region's AOAI endpoint unreachable, such as an NSG rule blocking outbound traffic to its resolved IP range.
Can I directly target Azure OpenAI with a Chaos Studio fault?
No — Azure OpenAI (a Cognitive Services account) is not currently among Chaos Studio's supported target resource types, unlike Cosmos DB, AKS, VM Scale Sets, and several other Azure services that do have native faults. This isn't necessarily a gap to work around so much as a reflection of what's actually useful to test: you don't control Azure OpenAI's own internal availability, which is Microsoft's operational responsibility under the service's SLA. What you do control, and what determines whether your application survives an AOAI outage, is your application's response to the endpoint becoming unreachable — retry logic, circuit breakers, and cross-region failover routing. The practical way to simulate "Azure OpenAI is down" is a network security group fault that blocks outbound traffic to the AOAI endpoint's resolved IP address from your compute tier, which produces the same connection failures your application would experience during a real outage.
How often should I run a chaos experiment against my Azure OpenAI failover path?
Regularly and automatically, not as a one-time validation. A chaos test run once proves the failover worked under the configuration that existed at that moment — retry policies, health-probe intervals, model deployment versions, and NSG rules all drift over time, sometimes for reasons entirely unrelated to the failover path itself, and any of those changes can silently degrade recovery behavior. Scheduling the drill to run automatically (weekly is a reasonable starting cadence for most teams, adjusted based on how frequently your infrastructure changes) and tracking the measured recovery time as a metric over successive runs turns a one-off proof into an ongoing regression check — a gradual increase in failover time becomes visible as a trend well before it becomes a real incident.

Popular posts from this blog

Explore Amazon’s AI strategy: how AWS Bedrock hosts frontier models like Claude, uses Trainium silicon, and bets on cloud neutrality.

The Cloud Incumbent: AWS Bedrock Hosts Every Frontier Model and Amazon Is Betting on Neutrality AWS at $37.6 billion quarterly revenue, growing 28%. $13 billion invested in Anthropic. A $100 billion Anthropic-to-AWS commitment. Trainium with $225 billion in customer revenue commitments. The most quietly powerful AI strategy in the race. By Francis Avorgbedor | Azure Engineer  ·  July 4, 2026  ·  14 min read  ·  Amazon · AWS · Cloud AI 74 SEVENAI Momentum Score — Rank #5 $37.6B AWS Q1 2026 revenue — 28% YoY growth ▲ Fastest in 15 quarters $13B Total Amazon investment in Anthropic to date ▲ Strategic anchor 100K+ Customers running Claude on AWS Bedrock ▲ Distribution moat Amazon's AI strategy is built on a thesis that every other Magnificent Seven company is testing against — and that Amazon is uniquely positioned to win regardless of the outcome. The thesis is neutrality. In a race where Microsoft has bet on OpenAI, Google has bet on Gemini, and Meta has bet...

Reduce AI application latency spikes by offloading embeddings to Foundry Local 1.2, improving edge performance, responsiveness, scalability, and cost efficiency.

Performance Fix Foundry Local 1.2 Linux ARM64 Embeddings Offline ASR The Edge Latency Drop: Fixing Latency Spikes by Offloading Embeddings to Foundry Local 1.2 You are paying a full cloud round trip — network, TLS, queue, throttle risk — to turn a twelve-word search query into a vector. That is the most expensive way possible to do one of the cheapest computations in your stack. Foundry Local 1.2 now runs on Linux ARM64, which means embeddings and speech recognition can happen on a Raspberry Pi, a Jetson, or a Graviton instance — offline, unmetered, and in single-digit milliseconds. The failure signature this guide resolves # Application Insights — the embedding call, not the LLM, is your tail latency: name p50 p95 p99 calls/day POST /embeddings (cloud) 89 ms 412 ms 3,847 ms 1,240,000 POST /chat/completions (cloud) 940 ms 1,720 ms 2,910 ms 38,000 ^^^^^^^^ ...

Find the hidden Windows 10 system files consuming up to 500GB, including hibernation, shadow copies, backups, and WinSxS, with safe cleanup steps.

  The 500GB System File That Eats Your Hard Drive Something on your Windows 10 drive is consuming hundreds of gigabytes and the normal tools cannot find it. This guide identifies every known culprit — from hibernation files and shadow copies to runaway backups and the Windows component store — and tells you exactly what is safe to delete, what to leave alone, and what the commands actually do.
How to Reset an Azure Virtual Machine to Factory Settings Using a Managed Disk Azure does not have a single "factory reset" button. What it does have is something better: the OS Disk Swap — a method that swaps out the corrupted or misconfigured OS disk for a clean Windows Server managed disk without deleting the VM, its NICs, its IP addresses, or any attached data disks. Here is how it works, when to use it, and the exact steps to execute it safely. FA Francis Avorgbedor Azure Engineer July 16, 2026 15 min read Azure VMs · Windows Server · Real-World Fix 3 Methods to achieve a clean Windows Server installation on an existing Azure VM ~15min Typical OS Disk Swap duration — VM retains its NICs, IPs, and data disks throughout 0 Data disks affected by an OS Disk Swap — data disks remain attached and untouched 1 Snapshot of the original OS disk you must take before starting — no exceptions Introduction Why Azure Does Not Have a Simple Factory Reset — and What to Do Instead On a ph...

Learn how to select Azure Files and Blob storage tiers, avoid early deletion fees, model costs, and automate lifecycle management for large file migrations.

Choosing the Right Azure Storage Tier for Large File Migrations The complete decision framework for storage tier selection during large file migrations — Azure Files tiers, Blob tiers, cost modelling, early deletion traps, lifecycle automation, and the 2026 changes that affect every migration running today. By Francis Avorgbedor | Azure Engineer  ·  July 14, 2026  ·  18 min read  ·  Storage Tiers · Cost Optimisation · Migration FA Francis Avorgbedor Azure Engineer  ·  SEVENAI  ·  Azure Field Notes 9 Distinct Azure storage tiers across Files and Blob — most engineers know only 3 15hrs Archive tier rehydration time at standard priority — the delay teams forget to plan for 128KB Minimum billable object size for Cool/Cold/Archive from July 2026 — a 32× trap for small files 70% How much retrieval and transaction fees add to a theoretical Archive storage bill The most expensive mistake I see on large Azure file migrations is not choosing the w...
Incident Playbook AKS Kubernetes kubectl 2026 AKS CrashLoopBackOff, Pending Pods, and NotReady Nodes — The Real Fixes Engineers Use Every AKS engineer eventually faces the same nightmare: CrashLoopBackOff at 2am, pods stuck Pending for no clear reason, or nodes flipping to NotReady mid-deployment. The difference between panic and control is knowing the exact diagnostic sequence — and the real fixes that work in production. This guide gives you both. 3 commands get pods, describe pod, and logs diagnose roughly 90% of AKS incidents before you touch anything else Exit 137 The code that means OOMKilled — the container hit its memory limit and was killed by the kernel (128 + SIGKILL 9) Events The bottom of kubectl describe is where the real cause lives — Pending, FailedScheduling, and image errors all surface there CoreDNS The single component behind most "intermittent" production failures — service discovery breaks quietly and looks like an app bug Table of Contents 01 The 3 Comm...
Can I Update My Old Computer to Windows 11 — and How Much Will It Cost? Your i7, 16GB RAM, 512GB SSD machine is powerful enough to run Windows 11 comfortably. The TPM 2.0 and Secure Boot wall is a security checkbox, not a performance ceiling. Here are two proven ways to get past it, what each one costs, and what you are trading away by doing so. $0 Cost of the Windows 11 licence if your existing Windows 10 is genuine — the upgrade remains free in 2026 2 Proven methods to bypass TPM 2.0 and Secure Boot — Rufus (easy) and Registry edit (manual) 25H2 Current Windows 11 version — all known bypass methods tested and confirmed working as of July 2026 Oct 2025 Windows 10 end of life — no more security updates. Staying on Windows 10 now carries real risk. First — Check Your BIOS Before Anything Else You Might Not Actually Need a Bypass Before running any bypass, open your BIOS and look at two settings. Many computers that fail the Windows 11 compatibility check have TPM 2.0 present in the hard...
Troubleshooting Guide AKS Kubernetes Real Solutions kubectl Azure Kubernetes Service (AKS) Troubleshooting Guide: Real Solutions to Common Problems CrashLoopBackOff at 2am. Pods stuck Pending with no obvious cause. Nodes going NotReady mid-deployment. DNS resolution silently failing in production. Every AKS engineer encounters these — the difference between engineers who panic and engineers who stay calm is knowing the exact sequence of diagnostic commands to run. This guide gives you that sequence, the root cause analysis for each failure mode, and the fix. 3 commands 90% of AKS problems are diagnosed with the same three kubectl commands: describe pod, logs --previous, and get events — in that order, every time Exit 137 The exit code that tells you everything: container killed by SIGKILL — either the Linux OOM killer (memory limit exceeded) or kubelet after grace period expired 5 min The CrashLoopBackOff ceiling: Kubernetes applies exponential backoff (10s → 20s → 40s → 80s → 160s → 3...
2026 Edition 100 Tools Software Engineering DevOps AIOps Top 100 Best AI Tools for Azure  Engineers and DevOps Professionals in 2026 85% of developers now regularly use AI tools. Fully AI-generated code accounts for nearly 28% of all pull requests. The question is no longer whether to use AI tools — it is which ones, in which combination, for which part of the lifecycle. This guide cuts through the noise: 100 tools, 10 categories, honest pricing, real use cases, and a selection framework for building your stack without redundancy. 85% Percentage of developers who now regularly use AI tools, per JetBrains' 2025 State of Developer Ecosystem report — up from near zero three years ago 28% Share of all pull requests containing primarily AI-generated code in 2026 — the metric that signals AI coding assistants have moved from experiment to workflow $50B Cursor's reported valuation in April 2026 Series D talks — the number that signals investor confidence in the AI developer tools mark...