ms-ai-architect/skills/ms-ai-engineering/references/api-management/apim-azure-front-door-ai.md
Kjell Tore Guttormsen 3a73eeafdc refactor(ms-ai-architect): R13 del 1 — nøytraliser Cosmo-personaen i ref-korpusets headinger, etter å ha rettet en gate som var målt usann to ganger
Ordre 20260912T193441Z-7358817909. Steg 1 var ikke transformen, men å rette
roadmapens R13-gate og få den ratifisert. Gaten `grep -rl "Cosmo"
skills/*/references -> 0` var usann på to uavhengige måter:

1. Ordren fanget den første: 451 av forekomstene er Azure Cosmos DB, ekte
   produktinnhold. Diskriminatoren er ikke bokstaven «s» — `Cosmos <norsk
   substantiv>` er genitiv av personaen (`### Cosmos tonalitet`), mens
   `Cosmos DB`/`CosmosClient`/`cosmos_ru` er produkt.
2. Denne økten fant den andre: 132 persona-forekomster ligger i prosa,
   tabeller, dialog-replikker og proveniens-linjer. Heading-nøytralisering
   kan ikke nå dem, så «0 persona» er uoppnåelig også under den ratifiserte
   formen. Operatøren ratifiserte alternativ A: gaten speiler formen, og de
   132 bokføres til R13b/R14.

Tre korreksjoner av premisser som sto i ordren og STATE:
  «ca 320 produkt»   -> 451 (case-sensitivt nett manglet 327 lowercase
                        TOC-ankre + 99 identifikatorer; sann nevner 1 638)
  «169 headinger»    -> 401. 169 var `^## For Cosmo`-prefikset (168) og var
                        internt inkonsistent med sin egen topp-variant (204)
  «417 matcher ingen
   populasjon»       -> 417 er cosmo-headinger utenfor kodefences; briefens
                        nevner var reell hele tiden

Fence-bevissthet er målt skadelig, ikke nødvendig: begge toggle-regler er
gale på dette korpuset (naiv toggle skjuler en ekte heading i
chain-of-thought-prompting.md, CommonMark-regelen ubalanserer
service-level-documentation-dr.md). Fence-agnostisk deteksjon finner 401
heading-linjer i nøyaktig de samme 40 variantene som fence-bevisst finner
400 i — ingen kodeblokk-linje er byte-identisk til en persona-heading. Derfor
nøkles transformen på 40 enumererte heading-tekster og ignorerer fences. En
ukjent variant kaster; en slug-kollisjon kaster. Ingenting auto-fikses.

TOC-en regenereres ikke, den rettes kirurgisk: alle 327 persona-lenker hadde
lenketekst lik én av de 40 heading-tekstene og anker lik slugify av den
(327/327, 0 avvik), så heading og TOC-entry skrives i samme operasjon og
ingen mellomtilstand etterlater en død lenke.

Ratifisert målform: `For Cosmo`, `For Cosmo Skyberg` og `For arkitekten
(Cosmo)` konvergerer på `For arkitekten`. To filer kolliderte og er adjudisert
ved å lese dem, ikke ved regel.

Verifisering (alle 7 kriterier fra ordren):
  G1 persona på heading-linjer   401 -> 0
  G2 døde fragmentlenker         1 -> 1 (pre-eksisterende, unntatt)
  G3 produkt-forekomster         451 -> 451; `Cosmos DB|Azure Cosmos` 308 = 308
  de 3 kun-produkt-filene        byte-identiske
  nettet validert begge veier    injisert persona feller G1; genitiv feller G1;
                                 produkt-heading og de 3 filene passerer
  hele diffen                    802 heading-linjer + 654 TOC-linjer, ANNET = 0
  linjeantall                    728 lagt til = 728 slettet
  suite                          1120/1120 (1097 + 23 nye)
  validate-plugin                250 PASS / 0 FAIL
  stikkprøve                     10 filer, alle 5 skills, inkl. de 3 mest
                                 produkt-tunge (26/20/19) — kun heading+TOC

Utenfor scope, urørt: de 4 SKILL.md, de 23 commands, CLAUDE.md, README.md,
NOTICE.md, docs/ (alt R14).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 22:12:28 +02:00

442 lines
14 KiB
Markdown

# APIM with Azure Front Door for Global AI Distribution
**Last updated:** 2026-06-24
**Status:** GA
**Category:** API Management & AI Gateway
**Type:** reference
**Source:** https://learn.microsoft.com/azure/frontdoor/front-door-overview
**Verified:** 2026-07-24
**Verified by:** judge-v3.1
---
## Innhold
- [Introduksjon](#introduksjon)
- [Global lastdistribusjon](#global-lastdistribusjon)
- [DDoS-beskyttelse](#ddos-beskyttelse)
- [Web Application Firewall](#web-application-firewall)
- [Edge Caching](#edge-caching)
- [Geografisk ruting](#geografisk-ruting)
- [Kostnadsestimat for Front Door + APIM](#kostnadsestimat-for-front-door--apim)
- [Referanser](#referanser)
- [For arkitekten](#for-arkitekten)
## Introduksjon
Nar organisasjoner ruller ut AI-tjenester globalt eller trenger ekstra beskyttelse og ytelsesoptimalisering, er kombinasjonen av Azure Front Door og Azure API Management en kraftig arkitektur. Azure Front Door gir global HTTP(S)-lastbalansering, DDoS-beskyttelse, Web Application Firewall (WAF), edge caching og TLS-offloading -- alt foran APIM som haandterer AI-spesifikk policy-haaandheving, token-ratebegrensning og backend-lastbalansering.
For norsk offentlig sektor er denne kombinasjonen relevant i flere scenarier: organisasjoner med innbyggertjenester som ma handtere trafikktopper (f.eks. skattemelding-perioden, eksamenssvar), tjenester som eksponeres mot internasjonale brukere, eller organisasjoner som krever ekstra lag med DDoS-beskyttelse. Azure Front Door sine globale PoP-er (Points of Presence) gir lavere latency for brukere narmere edge-lokasjoner.
Arkitekturen Front Door + APIM + AI Backend gir et tre-lags forsvar: Front Door handterer DDoS og WAF pa nettverksniva, APIM haandterer API-spesifikk sikkerhet og trafikkstyring, og Azure AI-tjenestene handterer modellspesifikk tilgangskontroll. Denne referansen dekker konfigurasjon, sikring og optimalisering av denne arkitekturen.
---
## Global lastdistribusjon
### Arkitekturoversikt
```
Brukere (globalt)
|
v
Azure Front Door (Global L7 Load Balancer)
|-- PoP Oslo (naermest norske brukere)
|-- PoP London
|-- PoP New York
|
v
APIM Instance(r)
|-- West Europe (primaer)
|-- North Europe (sekundaer)
|
v
AI Backends
|-- Azure OpenAI (West Europe)
|-- Azure OpenAI (Sweden Central)
|-- Microsoft Foundry (North Europe)
```
### Oppsett av Front Door-profil
Konfigurer Front Door med APIM som origin:
| Innstilling | Verdi |
|------------|-------|
| **Origin type** | API Management |
| **Origin hostname** | `{apim-name}.azure-api.net` |
| **Caching** | Enable caching (for GET-requests) |
| **Query string behavior** | Use Query String |
| **Health probe path** | `/status-0123456789abcdef` |
| **Health probe protocol** | HTTPS |
| **Health probe method** | GET |
| **Probe interval** | 30 sekunder |
### Bicep: Front Door med APIM Origin
```bicep
resource frontDoorProfile 'Microsoft.Cdn/profiles@2024-02-01' = {
name: frontDoorName
location: 'global'
sku: {
name: 'Premium_AzureFrontDoor' // Premium for Private Link + WAF
}
}
resource frontDoorEndpoint 'Microsoft.Cdn/profiles/afdEndpoints@2024-02-01' = {
parent: frontDoorProfile
name: 'ai-gateway-endpoint'
location: 'global'
properties: {
enabledState: 'Enabled'
}
}
resource originGroup 'Microsoft.Cdn/profiles/originGroups@2024-02-01' = {
parent: frontDoorProfile
name: 'apim-origin-group'
properties: {
loadBalancingSettings: {
sampleSize: 4
successfulSamplesRequired: 3
additionalLatencyInMilliseconds: 50
}
healthProbeSettings: {
probePath: '/status-0123456789abcdef'
probeRequestType: 'GET'
probeProtocol: 'Https'
probeIntervalInSeconds: 30
}
sessionAffinityState: 'Disabled'
}
}
resource originWestEurope 'Microsoft.Cdn/profiles/originGroups/origins@2024-02-01' = {
parent: originGroup
name: 'apim-west-europe'
properties: {
hostName: '${apimNameWestEurope}.azure-api.net'
httpPort: 80
httpsPort: 443
originHostHeader: '${apimNameWestEurope}.azure-api.net'
priority: 1
weight: 1000
enabledState: 'Enabled'
enforceCertificateNameCheck: true
}
}
resource originNorthEurope 'Microsoft.Cdn/profiles/originGroups/origins@2024-02-01' = {
parent: originGroup
name: 'apim-north-europe'
properties: {
hostName: '${apimNameNorthEurope}.azure-api.net'
httpPort: 80
httpsPort: 443
originHostHeader: '${apimNameNorthEurope}.azure-api.net'
priority: 2 // Failover
weight: 1000
enabledState: 'Enabled'
enforceCertificateNameCheck: true
}
}
resource route 'Microsoft.Cdn/profiles/afdEndpoints/routes@2024-02-01' = {
parent: frontDoorEndpoint
name: 'ai-gateway-route'
properties: {
originGroup: {
id: originGroup.id
}
supportedProtocols: [ 'Https' ]
patternsToMatch: [ '/ai/*' ]
forwardingProtocol: 'HttpsOnly'
httpsRedirect: 'Enabled'
linkToDefaultDomain: 'Enabled'
}
}
```
---
## DDoS-beskyttelse
### Front Door innebygd DDoS-beskyttelse
Azure Front Door gir plattform-niva DDoS-beskyttelse automatisk:
| Beskyttelsestype | Dekning |
|-----------------|---------|
| L3/L4 DDoS | Automatisk for alle Front Door-profiler |
| L7 DDoS | Via WAF-policyer |
| Volumetriske angrep | Absorberes av Front Doors globale nettverk |
| Protocol-angrep | Filtreres pa edge |
| Application-layer | WAF rate limiting + bot protection |
### Kombinert beskyttelse
For kritiske AI-tjenester, kombiner Front Door med Azure DDoS Protection:
```bicep
resource ddosProtectionPlan 'Microsoft.Network/ddosProtectionPlans@2023-11-01' = {
name: 'ai-gateway-ddos-plan'
location: location
properties: {}
}
```
---
## Web Application Firewall
### WAF-policy for AI Gateway
```bicep
resource wafPolicy 'Microsoft.Network/FrontDoorWebApplicationFirewallPolicies@2024-02-01' = {
name: 'aiGatewayWafPolicy'
location: 'global'
sku: {
name: 'Premium_AzureFrontDoor'
}
properties: {
policySettings: {
enabledState: 'Enabled'
mode: 'Prevention'
requestBodyCheck: 'Enabled'
requestBodyInspectLimitInKB: 128
}
managedRules: {
managedRuleSets: [
{
ruleSetType: 'Microsoft_DefaultRuleSet'
ruleSetVersion: '2.1'
ruleGroupOverrides: []
}
{
ruleSetType: 'Microsoft_BotManagerRuleSet'
ruleSetVersion: '1.1'
}
]
}
customRules: {
rules: [
{
name: 'RateLimitAiRequests'
priority: 100
enabledState: 'Enabled'
ruleType: 'RateLimitRule'
rateLimitDurationInMinutes: 1
rateLimitThreshold: 100
matchConditions: [
{
matchVariable: 'RequestUri'
operator: 'Contains'
matchValue: [ '/ai/' ]
}
]
action: 'Block'
}
{
name: 'BlockSuspiciousPayloads'
priority: 200
enabledState: 'Enabled'
ruleType: 'MatchRule'
matchConditions: [
{
matchVariable: 'RequestBody'
operator: 'Contains'
matchValue: [
'ignore previous instructions'
'ignore all instructions'
'disregard your system prompt'
]
transforms: [ 'Lowercase' ]
}
]
action: 'Block'
}
{
name: 'GeoBlockNonAllowed'
priority: 300
enabledState: 'Enabled'
ruleType: 'MatchRule'
matchConditions: [
{
matchVariable: 'RemoteAddr'
operator: 'GeoMatch'
negateCondition: true
matchValue: [ 'NO', 'SE', 'DK', 'FI' ] // Nordiske land
}
]
action: 'Log' // Start med Log, bytt til Block etter validering
}
]
}
}
}
```
### WAF-regler tilpasset AI-trafikk
| Regel | Type | Handling | Formal |
|-------|------|---------|--------|
| Rate limit per IP | RateLimit | Block | Maks 100 req/min per IP |
| Prompt injection patterns | Match | Block | Blokkerer kjente injeksjonsmonstre |
| Geo-filtering | Match | Log/Block | Begrens til tillatte land |
| Bot protection | Managed | Block | Identifiserer og blokkerer botter |
| OWASP Core Rules | Managed | Block | Standard webapplikasjonsbeskyttelse |
| Payload size limit | Match | Block | Maks request body-storrelse |
---
## Edge Caching
### Caching-strategi for AI med Front Door
For AI-API-er er caching begrenset til GET-requests og statisk innhold. POST-baserte chat completion-kall caches ikke av Front Door, men det finnes bruksomrader:
| Innholdstype | Cachebar? | Strategi |
|-------------|-----------|----------|
| Chat completions (POST) | Nei | Bruk APIM semantisk caching |
| Model listing (GET) | Ja | Front Door edge cache |
| API documentation | Ja | Front Door edge cache |
| Health endpoints | Nei | Bypass cache |
| Static assets (dev portal) | Ja | Front Door edge cache |
### Caching for Developer Portal
```bicep
resource devPortalRoute 'Microsoft.Cdn/profiles/afdEndpoints/routes@2024-02-01' = {
parent: frontDoorEndpoint
name: 'dev-portal-route'
properties: {
originGroup: {
id: devPortalOriginGroup.id
}
supportedProtocols: [ 'Https' ]
patternsToMatch: [ '/developer/*' ]
forwardingProtocol: 'HttpsOnly'
cacheConfiguration: {
queryStringCachingBehavior: 'IgnoreQueryString'
compressionSettings: {
isCompressionEnabled: true
contentTypesToCompress: [
'text/html'
'text/css'
'application/javascript'
'application/json'
]
}
}
}
}
```
---
## Geografisk ruting
### Priority-basert ruting med failover
```
Bruker i Norge
|
v
Front Door PoP Oslo
|
|-- Priority 1: APIM West Europe (Nederland)
|-- Priority 2: APIM North Europe (Irland)
|
v
APIM West Europe
|
|-- Priority 1: Azure OpenAI Sweden Central
|-- Priority 2: Azure OpenAI West Europe
```
### Restriksjon: Kun Front Door-trafikk til APIM
Sikre at APIM kun aksepterer trafikk fra Front Door:
```xml
<policies>
<inbound>
<base />
<!-- Verify Front Door ID header -->
<check-header name="X-Azure-FDID"
failed-check-httpcode="403"
failed-check-error-message="Access denied. Traffic must route through Azure Front Door."
ignore-case="false">
<value>{{FrontDoorId}}</value>
</check-header>
<!-- Additionally restrict to Front Door IP ranges -->
<ip-filter action="allow">
<address-range from="147.243.0.0" to="147.243.255.255" />
<!-- AzureFrontDoor.Backend service tag ranges -->
</ip-filter>
</inbound>
</policies>
```
### Private Link mellom Front Door og APIM
For maksimal sikkerhet, bruk Front Door Premium med Private Link:
```bicep
resource privateEndpoint 'Microsoft.Cdn/profiles/originGroups/origins@2024-02-01' = {
parent: originGroup
name: 'apim-private'
properties: {
hostName: '${apimName}.azure-api.net'
originHostHeader: '${apimName}.azure-api.net'
priority: 1
weight: 1000
enabledState: 'Enabled'
sharedPrivateLinkResource: {
privateLink: {
id: apiManagement.id
}
privateLinkLocation: location
groupId: 'gateway'
requestMessage: 'Front Door Private Link to APIM'
}
}
}
```
---
## Kostnadsestimat for Front Door + APIM
| Komponent | Manedlig kostnad (NOK) |
|-----------|----------------------|
| Front Door Premium (base) | ~4 000 |
| Front Door: 10M requests | ~1 500 |
| Front Door: Data transfer (100 GB) | ~1 000 |
| WAF Policy (Premium) | ~4 500 |
| APIM Standard v2 | ~20 000 |
| **Total** | **~31 000** |
Merk: Front Door Standard er rimeligere (~60% av Premium-pris) men mangler Private Link og WAF Managed Rules.
---
## Referanser
- [Configure Front Door Standard/Premium in front of Azure API Management](https://learn.microsoft.com/en-us/azure/api-management/front-door-api-management) -- trinnvis veiledning
- [What is Azure Front Door?](https://learn.microsoft.com/en-us/azure/frontdoor/front-door-overview) -- oversikt
- [Azure Front Door DDoS protection](https://learn.microsoft.com/en-us/azure/frontdoor/front-door-ddos) -- DDoS-beskyttelse
- [Web Application Firewall on Azure Front Door](https://learn.microsoft.com/en-us/azure/web-application-firewall/afds/afds-overview) -- WAF-oversikt
- [AI gateway in Azure API Management](https://learn.microsoft.com/en-us/azure/api-management/genai-gateway-capabilities) -- AI gateway
- [Restrict caller IPs policy](https://learn.microsoft.com/en-us/azure/api-management/ip-filter-policy) -- IP-filtrering
- [Check header policy](https://learn.microsoft.com/en-us/azure/api-management/check-header-policy) -- header-validering
- [Architecture best practices for Azure Front Door](https://learn.microsoft.com/en-us/azure/well-architected/service-guides/azure-front-door) -- Well-Architected-anbefalinger
## For arkitekten
- **Bruk denne referansen** nar kunden trenger global distribusjon av AI-tjenester, ekstra DDoS-beskyttelse, eller WAF foran AI-gateway-en sin.
- For de fleste norske offentlige virksomheter er Front Door overkill for rene interne AI-tjenester. Anbefal det primaert for innbyggerrettede tjenester med hoy trafikk eller behov for geographic redundancy.
- Front Door Premium er nodvendig for Private Link til APIM og WAF Managed Rules. Standard-tier mangler disse, men er tilstrekkelig for basic lastbalansering og DDoS.
- Husk alltid a konfigurere `X-Azure-FDID`-header-sjekk i APIM for a forhindre at noen omgar Front Door og kaller APIM direkte.
- Kombiner Front Door WAF-regler for prompt injection-monstre pa nettverksniva med APIM Content Safety policy for AI-spesifikk innholdsmoderasjon -- dette gir forsvar i dybden.