Composite scenario, not a real company. Assembled from common industry patterns; every number is illustrative and its assumptions are listed at the end.
This case belongs to Cloud platforms for AI.
Not legal advice. The case shows how to turn a residency rule into settings and evidence. Whether a given setting satisfies a given law or contract is a question for the agency's counsel. Provider facts are as of 2026-10-23.
Context
- A regional agency's caseworkers answer citizen letters. An assistant drafts a reply from the letter and the case notes, and a caseworker edits and sends it.
- The agency's rule says processing of these records must stay in one named region.
- The service handles 40,000 requests a day through a Model gateway to a managed model service.
- Logs, a search index of case notes and nightly backups are owned by the agency.
Problem statement
| Requirement | Measure |
|---|---|
| R1: inference stays in the named region | 0 of every request processed elsewhere |
| R2: everything the agency owns stays in the region | Logs, index, backups and keys all in the region |
| R3: the claim can be proved | Every event checked daily, not a sample |
| R4: content logs hold no raw personal data | Redaction before storage, retention set |
Constraints
- The rule names a region, not a geography, so geography-wide options are suspect.
- No automatic failover outside the region.
- The provider's pages, not the agency's assumptions, define where processing can happen. Only AWS documents an in-Region option: "Your requests never leave the AWS Region you specify". Azure's and Google's narrowest documented levels are a geography and a jurisdiction, so on those clouds R1 needs counsel's view or option E.
Why the traditional approach fell short
Hand-written replies are slow and the backlog grows. Template libraries fit common letters but cannot read free text. A contract clause that promises residency is not evidence: auditors ask for a record of where each request was processed, and an application log that shows only the call you made cannot answer that.
Options considered
| Option | Why accepted or rejected |
|---|---|
| A. Non-AI: caseworkers draft from templates | Kept as the degraded mode, because the rule forbids routing elsewhere during an outage |
| B. Managed service with global routing | Rejected: AWS describes global profiles as "routed worldwide", and Google says global endpoints "don't provide any data residency guarantees" |
| C. Geographic profile, data zone or multi-region endpoint | Rejected for a region-level rule: these stay inside a wider boundary. AWS says prompts and results "might move outside of your source Region"; Azure says processing "might be processed between regions within that geography" |
| D. Managed service pinned to one region, plus a daily audit check | Accepted, on a provider that documents an in-region option |
| E. Self-hosted model in the region | Revisit if no provider offers the named region: the agency would run capacity and patching |
Solution architecture
Figure 1. A pinned call path, with logs and keys in the same region
How to read this: everything the agency owns for this feature sits inside one regional boundary, and the audit job reads the provider's own record of each call.
Figure 2. One request and the check that proves it
How to read this: steps 1 to 5 are the request, and steps 6 and 7 are the evidence loop that runs separately.
How AI solved it, step by step
Under the hood
The proof rests on what the provider's audit record contains.
- AWS: the cross-Region inference page says CloudTrail logs all cross-Region inference requests "in your source Region", and the
additionalEventData.inferenceRegionfield identifies where requests were processed. The CloudTrail page's example putsinferenceRegionin the stream-completion event, a second event for each streaming call that is not an API call and must not be counted as an invocation. Its example for a call showsawsRegionandrequestParameters.modelId. The pages read do not say whether a plain call carriesinferenceRegion. Invocation logs go to a destination in the same account and Region. - Azure: data stored at rest stays in the designated geography for every deployment type, and only the place of processing changes between Standard, Data Zone and Global types.
- Google: the data residency page makes the same split between data at rest and ML processing.
So the check flags any event whose Region is outside the allowed set, whose model ID has a geography or global prefix (a profile), or whose inferenceRegion is outside it. Only AWS's pages read name such a field. Content logging stays a separate decision, because the check needs metadata, not prompts. The audit log is the provider's record, and whether it satisfies a legal test is counsel's question. Mechanism: Under the hood: Logging and audit trails in a managed AI service.
What went wrong / failure modes
| Failure | Designed mitigation |
|---|---|
| The gateway configuration drifts to a routing profile | CI validates the configuration and the Model gateway refuses to start with it |
| A log bucket is created in another region | Infrastructure policy denies it. AWS invocation logs already require a destination in the same Region |
| A backup or replica of the index sits elsewhere | List every copy in a residency register and treat replicas as in scope |
| The region has an outage | No failover outside the boundary: the Orchestrator switches to template drafting and shows a banner |
| A caseworker pastes a citizen's identifier into the prompt | Redact before any content log, and keep content logging off by default |
| The audit job misses a day | Alert when fewer events than the request counter, and re-run |
Results
These are illustrative targets, not measurements.
| Measure | Before | Target |
|---|---|---|
| Requests processed outside the named region | Unknown | 0 of 14,600,000 a year |
| Events checked | None | 100%, daily |
| Time to detect a violation | Next audit | At most 1 day |
| Log volume (metadata and redacted summary, 6 KB each) | n/a | 240 MB a day, 87.6 GB a year |
Tradeoffs and when NOT to use this approach
- A single region has one region's capacity and quotas, with no cross-region spill-over.
- Fewer models may be available in one region than globally.
- If the rule is written at geography level, a geographic option may be enough and gives more capacity.
- If no provider offers the named region, the choice becomes a self-hosted model, with its own cost.
Design rules extracted
- Write the processing boundary into the requirement (region, country or geography) before choosing a setting.
- Choose the narrowest routing level that satisfies it.
- Everything the agency owns for the feature (logs, index, backups, keys) goes inside the same boundary.
- Evidence is a daily check of every event, not a policy document.
- Degrade inside the boundary rather than fail over outside it.
Assumptions
- 40,000 requests a day x 365 = 14,600,000 events a year, one call event per non-streaming request. The region, the agency and the single-region rule are invented.
- 6 KB per stored record: 40,000 x 6 KB = 240,000 KB = 240 MB a day; 240 MB x 365 = 87,600 MB = 87.6 GB a year (decimal units).
- The 1-day detection time is a design target.
- Sources as of 2026-10-23: https://docs.aws.amazon.com/bedrock/latest/userguide/models-region-compatibility.html, https://docs.aws.amazon.com/bedrock/latest/userguide/cross-region-inference.html, https://docs.aws.amazon.com/bedrock/latest/userguide/geographic-cross-region-inference.html, https://docs.aws.amazon.com/bedrock/latest/userguide/logging-using-cloudtrail.html, https://docs.aws.amazon.com/bedrock/latest/userguide/model-invocation-logging.html, https://learn.microsoft.com/en-us/azure/foundry/responsible-ai/openai/data-privacy, https://learn.microsoft.com/en-us/azure/foundry/foundry-models/concepts/deployment-types, https://docs.cloud.google.com/gemini-enterprise-agent-platform/resources/data-residency.
Last verified: 2026-10-23