Microsoft Foundry in Practice

Multi-Region Foundry Deployments for Resilience

If Claude sits in a customer-facing flow, one region's bad day becomes your outage. Foundry's region map is small but workable — here's how to build a second leg and route around trouble.

Claude 3P 101 · Updated July 2026 · Unofficial guide

Resilience planning for Claude on Microsoft Foundry starts with an unusual fact: the region list is short. Global Standard deployments — the type supporting all Claude models and both hosting versions — are available in East US2 and Sweden Central, and your Foundry resource must live in a supported region (deploying elsewhere fails with a "Region not available" error). A Data Zone Standard (US) type additionally exists for claude-sonnet-5, claude-opus-4-8, and claude-haiku-4-5 on Azure-hosted deployments, keeping inference within the United States. So a "multi-region" Foundry design today is concretely a two-legged design: one resource and deployment in East US2, another in Sweden Central.

What "Global" already does — and doesn't

Don't confuse the deployment's resource region with where inference runs. A Global Standard deployment routes processing globally by design; the region you pick anchors the resource and, for Azure-hosted deployments, where data at rest stays (scoped to the Global or Data Zone option you chose). The second leg is therefore not about moving compute closer — it protects you against a regional failure of the front door: the resource, its endpoint, and the Azure ingress path in that region. If your requirement is data residency rather than resilience, that's the Data Zone Standard discussion in Foundry regions, and note the US Data Zone type carries the same 1.1x pricing multiplier as inference_geo: "us" elsewhere.

Building the second leg

Each region needs its own Foundry resource and its own Claude deployment inside it, because endpoints are per-resource: https://<resource-name>.services.ai.azure.com/anthropic. Provision both from the same templates (see Foundry in Azure DevOps pipelines) and give the deployments in both regions the same deployment name — the name is the model value applications send, it cannot be changed after creation, and identical names mean failover changes only the base URL, never the request body. Keys are per-resource too, so each leg has its own credential; Entra ID authentication avoids managing two sets.

One genuinely important quota caveat: Foundry quota is managed at the subscription level, and all Global Standard deployments of the same model and version in a subscription draw from one shared pool across regions. Your second region is not a second bucket of capacity. Failing over redirects traffic, but the requests-per-minute and input-tokens-per-minute budget is the one you already had — so a failover plan that assumes doubled headroom will disappoint. Size the shared pool for your full load, and request increases through Microsoft's quota form if needed.

Rule of thumb: two regions buy you endpoint resilience, not extra throughput. Capacity planning and failover planning are separate exercises on Foundry.

Routing and failover

Azure Traffic Manager is Azure's DNS-based routing service: clients resolve one hostname, and Traffic Manager answers with the healthy endpoint according to a priority or performance policy. It is a reasonable front for two Foundry legs, with two caveats. First, DNS failover is not instant — cached DNS answers keep some clients on the failed leg until the record's time-to-live expires, so your application still needs request-level retry against the secondary. Second, health probes need a meaningful target; probing a Claude endpoint means sending a real (tiny, cheap) Messages request, since the specifics of any unauthenticated health path aren't documented — keep the probe request minimal, e.g. a few tokens on claude-haiku-4-5.

Many teams skip shared routing infrastructure entirely and fail over in the client, which the SDK makes trivial because the two legs differ only by resource name:

import os
from anthropic import AnthropicFoundry

REGIONS = ["myres-eastus2", "myres-swedencentral"]

def call_claude(messages, **kw):
    for i, resource in enumerate(REGIONS):
        client = AnthropicFoundry(
            api_key=os.environ[f"FOUNDRY_KEY_{i}"], resource=resource)
        try:
            return client.messages.create(
                model="claude-sonnet-5", max_tokens=512,
                messages=messages, **kw)
        except Exception:
            if i == len(REGIONS) - 1:
                raise

Keep the exception handling smarter in production than this sketch — a 429 (rate limit) should back off rather than fail over, since the quota pool is shared and the second region will be just as throttled. Reserve failover for connection errors and 5xx-class failures, and log request-id and apim-request-id from failures for support.

Where to go next

This article covers the routing layer; disaster recovery planning for Foundry-dependent applications covers the RTO/RPO thinking above it. For the platform-neutral version of surviving a provider outage, see multi-platform failover.

Sources