Azure Front Door (borde compartido)¶
Borde HTTP compartido de Honne: Azure Front Door Standard + WAF custom.
No está en el Terraform del MVP Finance — vive en un RG propio para no acoplarse al ciclo de vida de rg-eai-dev-mxc.
Runbook operativo (scripts en el repo): scripts/edge/README.md
URLs DEV (entrada pública)¶
| Superficie | URL Front Door | Origin |
|---|---|---|
| Portal Finance | https://ep-finance-dev-gfayg5axbhd7h5hf.z02.azurefd.net/ | ACA ca-eai-finance-web-dev |
| Wiki docs | https://ep-docs-dev-hhg4hpa5ecajdhfm.z02.azurefd.net/ | Storage static steaidevwikifz1d |
Wiki también sigue disponible en Storage (origen):
https://steaidevwikifz1d.z41.web.core.windows.net/
Usar Front Door en demos
El portal Finance debe abrirse por el hostname AFD, no por el FQDN del Container App.
MSAL usa window.location.origin: cada host tiene su propia sesión.
Recursos¶
| Pieza | Nombre |
|---|---|
| Resource Group | rg-honne-edge-shared (Mexico Central) |
| Profile | afd-honne-edge-shared · Standard_AzureFrontDoor |
| Endpoint Finance | ep-finance-dev |
| Endpoint Wiki | ep-docs-dev |
| Origin groups | og-eai-finance-web, og-eai-docs-wiki |
| WAF | wafhonneedgeshared · Prevention · RateLimit Disabled; UA vacío + path traversal Enabled |
| Security policy | sp-waf-basic → finance + docs |
| Front Door ID | 7b77b579-3f05-4d6d-8502-78ebc82f5c1b (activo en finance-web) |
Tags: purpose=shared-edge, managedBy=manual.
flowchart LR
U[Usuario] --> AFD[AFD Standard<br/>rg-honne-edge-shared]
AFD -->|HTML /api| WEB[finance-web ACA]
AFD -->|307 /_next/static| WEB
AFD -->|ep-docs-dev| WIKI[Storage $web]
WEB -->|proxy JWT| APIM[APIM]
APIM --> API[finance-api ACA]
⚠ Bypass obligatorio finance (no quitar)¶
Chrome envía Accept-Encoding: gzip, …. En este perfil AFD, pedir gzip en /_next/static (CSS/JS) puede colgar la respuesta (15–90 s) → el portal se queda en “Preparando acceso…”. El Container App directo no tiene el problema.
Mitigación en DEV (regla AFD — no borrar):
Regla (rsFinanceAccelerate) |
Qué hace |
|---|---|
RedirectStaticToOrigin |
UrlPath begins /_next/static → 307 al FQDN ACA ca-eai-finance-web-dev… |
ForceIdentityEncoding |
Overwrite Accept-Encoding: identity hacia origen |
| Compresión ruta finance | OFF |
HTML y /api/* siguen por AFD. Solo los estáticos Next se redirigen al origen.
No reactivar a ciegas
- No volver a comprimir CSS/JS en AFD finance sin probar con
Accept-Encoding: gzip, deflate, br. - No rate-limit WAF con match
RequestUri Contains /(quema el cupo con chunks Next.js).
Smoke rápido:
# Debe ser 307 → ACA (no hang)
curl.exe -sI -H "Accept-Encoding: gzip, deflate, br" `
"https://ep-finance-dev-gfayg5axbhd7h5hf.z02.azurefd.net/_next/static/chunks/webpack-bd5533d1f20f7272.js"
# Home AFD
curl.exe -sI "https://ep-finance-dev-gfayg5axbhd7h5hf.z02.azurefd.net/"
WAF (Standard)¶
Modo actual: Prevention; policy en ep-finance-dev + ep-docs-dev.
| Regla | Acción | Config DEV |
|---|---|---|
RateLimitPerIP |
Block | Disabled (match / tumba Next.js; no reactivar así) |
BlockEmptyUserAgent |
Block | Enabled |
BlockSuspiciousPathTraversal |
Block | Enabled |
Health probes de origen: GET /api/health (finance) o / (wiki) — no HEAD.
Logs WAF/Access → Log Analytics log-eai-dev-mexicocentral (diagnostic setting afd-waf-to-law).
AzureDiagnostics
| where Category == "FrontDoorWebApplicationFirewallLog"
| where TimeGenerated > ago(2h)
| where action_s == "Block" or action_s == "BlockAndLog"
| project TimeGenerated, ruleName_s, action_s, clientIP_s, requestUri_s, httpStatus_d, trackingReference_s
| order by TimeGenerated desc
Caché y compresión¶
| Endpoint | Comportamiento |
|---|---|
| Wiki | Compresión ON · CSS/JS/fuentes/imágenes 7 d · HTML ~1 h |
| Finance | Compresión OFF · /_next/static → 307 a ACA · HTML/API no-store |
Rule sets: rsDocsAccelerate, rsFinanceAccelerate.
Tras cada deploy de finance-web (HTML/API; los estáticos viven en ACA tras el 307):
az afd endpoint purge -g rg-honne-edge-shared `
--profile-name afd-honne-edge-shared `
--endpoint-name ep-finance-dev `
--content-paths "/*"
Lock FRONT_DOOR_ID (finance-web)¶
Middleware en apps/finance-web/src/middleware.ts:
FRONT_DOOR_ID en ACA |
Efecto |
|---|---|
GUID del perfil AFD (7b77b579-…) |
Solo requests con X-Azure-FDID coincidente; FQDN ACA → 403 (salvo /api/health y /_next/static) |
| vacío / ausente | Kill switch OFF |
DEV actual: lock ON. Persistido en:
- Variable group ADO eai-terraform-dev → TF_VAR_front_door_id
- Pipeline eai-terraform-dev plan → -var=front_door_id=…
- infra/environments/dev/terraform.tfvars.example
Smoke borde: pwsh scripts/smoke-afd-edge.ps1
Wiki: sin lock — permanece pública.
Custom domain¶
AFD ya tiene los custom domains creados (cert managed). Falta DNS en honne.com.
| Uso | FQDN | Estado AFD |
|---|---|---|
| Portal | finance-dev.honne.com |
Creado · validación Pending · asociado a route-web |
| Wiki | docs-dev.honne.com |
Creado · validación Pending · asociado a route-docs |
Pedir a DNS (honne.com) — 4 CNAME:
| Host | Valor |
|---|---|
finance-dev |
ep-finance-dev-gfayg5axbhd7h5hf.z02.azurefd.net |
_dnsauth.finance-dev |
_m9ulz6sssitcgmwpgmfpxwegll9y19f |
docs-dev |
ep-docs-dev-hhg4hpa5ecajdhfm.z02.azurefd.net |
_dnsauth.docs-dev |
_1vrqalu9onxt5mxfnutv2dr6j5rda28 |
Tokens de validación caducan ~2026-09-21. Tras el DNS: Azure valida dominio → cert managed → isActive=true.
*.azurefd.net sigue activo (linkToDefaultDomain=Enabled) hasta el cutover.
Entra SPA: redirects https://finance-dev.honne.com/ (+ sin slash) deben existir en la app.
Hasta DNS listo, demos siguen en *.azurefd.net.
Entra (redirect URIs)¶
SPA eai-finance-web-dev (57e764e2-…) debe incluir:
https://ep-finance-dev-gfayg5axbhd7h5hf.z02.azurefd.net/https://ep-finance-dev-gfayg5axbhd7h5hf.z02.azurefd.net(sin slash)- FQDN ACA (fallback / debug)
http://localhost:3000/
Detalle de identidad: entra-apim-finance.md.
Por qué RG aparte (manual)¶
- Transversal — mismo perfil para Finance, futuras apps, wikis.
- Ciclo de vida — no se destruye con
terraform destroydel MVP. - Pruebas de borde — WAF, custom domains, routing sin acoplar a
rg-eai-dev-mxc.
Agregar otro origen: script scripts/edge/Add-HonneAfdOrigin.ps1 en el repo.
Coste orientativo (retail USD)¶
| Concepto | Orden de magnitud / mes |
|---|---|
| AFD Standard base | ~$35 |
| WAF policy + reglas custom | ~$5–10 |
| Requests + egress | según tráfico |
Cifras de calculadora Azure; ver inventario completo en azure-resources.md.