Saltar a contenido

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-basicfinance + 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/static307 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/static307 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-devTF_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)

  1. Transversal — mismo perfil para Finance, futuras apps, wikis.
  2. Ciclo de vida — no se destruye con terraform destroy del MVP.
  3. 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.


Relacionado