html Un sitio estático con pulso: análisis de visitantes seguro para la privacidad en AWS — Bernd Kuhlen
BK BERND KUHLENTodas las notas ↗
← Volver a las notas de campo

Un sitio estático con pulso: análisis de visitantes seguro para la privacidad en AWS

Un sitio web estático pasa maravillosamente sin incidentes. No hay ningún servidor de aplicaciones a la espera de ser parcheado, ningún grupo de conexiones a bases de datos que agotar ni una API pública que deba permanecer activa las 24 horas del día. Un navegador pide archivos; una red de entrega de contenido los devuelve.

Esa sencillez planteó una pregunta interesante para este portafolio: ¿podría mostrar dónde se lee el sitio y cómo cambia el tráfico de solicitudes con el tiempo sin convertir el sitio en una aplicación dinámica o publicar información que deba permanecer privada?

La respuesta pasó a ser una pequeña canalización de datos creada a partir de los registros de acceso de CloudFront, CloudWatch, Lambda, EventBridge y un único objeto JSON en S3. Los visitantes ven un mapa mundial, los totales de los países, las páginas más populares y las tablas de tasas de solicitud. Nunca reciben registros, direcciones IP, agentes de usuario o historiales de navegación individuales sin procesar.

El sitio web permanece estático. Los datos se preparan en otro lugar y llegan como un archivo estático más.

La arquitectura en una sola ruta de solicitud

La ruta de solicitud pública sigue siendo deliberadamente corta:

  1. Un visitante solicita el sitio a través de Amazon CloudFront.
  2. CloudFront sirve archivos en caché cuyo origen privado es un cubo de S3.
  3. El navegador busca más tarde content/public-visitors.json como cualquier otro activo estático.
  4. El JavaScript del lado del cliente renderiza el mapa y los gráficos de ese documento anónimo.

El navegador no invoca Lambda. No consulta CloudWatch. No tiene credenciales de AWS y no puede solicitar un intervalo de tiempo diferente ni un registro más detallado. Todos los trabajos caros y delicados se realizan fuera de la ruta de las solicitudes públicas.

Entre bastidores, la ruta de datos tiene este aspecto:

CloudFront → CloudWatch Logs → scheduled Lambda → aggregated JSON → S3 → CloudFront → browser

Esta separación es la decisión arquitectónica clave. El sistema operativo puede funcionar con datos de acceso detallados; el sistema de publicación solo emite el pequeño subconjunto destinado a la exhibición pública.

Coleccione una vez, publique menos

La versión 2 del registro estándar de CloudFront entrega los campos del registro de acceso seleccionados a un grupo de CloudWatch Logs. El registro de operaciones contiene información suficiente para investigar las solicitudes y los códigos de estado, pero eso no significa que todo pertenezca a un panel público.

La función de publicación reduce deliberadamente los datos a agregados:

  • páginas HTML vistas exitosas agrupadas por código de país;
  • las rutas HTML más solicitadas;
  • solicitudes por minuto derivadas de métricas de estado HTTP agregadas;
  • una marca de hora actualizada y etiquetas que describan cada intervalo temporal.

El archivo generado no contiene direcciones IP de origen, ubicaciones a nivel de ciudad, cookies, cadenas de usuario-agente ni secuencias que identifiquen el viaje de un visitante. El resultado público responde «¿qué tráfico recibió el sitio?» en lugar de «¿quién lo visitó?»

También por eso uso la frase páginas vistas, no gente. Un lector puede crear muchas solicitudes. Los rastreadores de búsqueda, los servicios de previsualización de enlaces, las sondas de monitorización y otros tipos de automatización pueden aparecer junto con el tráfico humano. El panel presenta señales de infraestructura, no identidades.

Por qué CloudWatch está en el medio

CloudWatch proporciona dos representaciones útiles de la misma actividad. CloudWatch Logs Insights puede consultar registros de solicitudes estructurados para obtener agregados de países y páginas. Los filtros métricos cuentan las cuatro familias de estados HTTP (2xx, 3xx, 4xx y 5xx), por lo que los datos métricos de CloudWatch pueden generar series de tasas de solicitud sin analizar repetidamente cada evento de registro.

El conjunto de datos público ofrece varios puntos de vista:

  • los totales de países de las 24 horas, 7 y 30 días anteriores;
  • solicitar puntos para 24 horas, 7 días, 30 días y 12 meses;
  • intervalos de tiempo más gruesos para rangos más largos, manteniendo el documento compacto.

Los registros de CloudFront no son un flujo de eventos en tiempo real. AWS señala que los registros estándar se entregan normalmente en una hora, mientras que algunas entradas pueden llegar más tarde. Eso hace que se adapten bien a un panel retrospectivo honesto, no a un contador de visitas en vivo.

Una instantánea programada en lugar de una API pública

Una regla de EventBridge invoca la Lambda de publicación cada seis horas. La función ejecuta sus consultas limitadas, solicita la serie métrica, reúne el documento y sobrescribe exactamente una clave de S3: content/public-visitors.json.

Seis horas es intencionadamente conservador. El análisis de visitantes no necesita actualizarse segundo a segundo, y cada actualización escanea los datos de registro. Un intervalo más corto crearía más ejecuciones de consultas y un coste más alto sin que la página fuera mucho más útil.

El objeto JSON se sirve con cabeceras de caché orientadas a la revalidación. Por lo tanto, la página de inicio puede descubrir una instantánea más reciente mientras CloudFront sigue protegiendo el origen de S3. No es necesario el despliegue completo del sitio ni la invalidación global de la caché cuando cambian las estadísticas.

Este modelo de instantáneas tiene un modo de fallo agradable. Si una consulta o invocación de Lambda no funciona, el documento estático existente sigue disponible. El panel de control puede quedar obsoleto, pero la cartera permanece en línea y ningún pedido espera al proceso de análisis.

El mínimo privilegio mantiene el radio de la explosión pequeño

La editorial Lambda utiliza una función de IAM dedicada. Sus permisos pertinentes están restringidos intencionadamente:

  • ejecutar y recuperar consultas únicamente en el grupo de registro de acceso designado;
  • leyó las métricas de CloudWatch requeridas para la tabla de tasas de solicitudes;
  • escribir solo content/public-visitors.json en la bolsa del sitio;
  • escribir sus propios registros de ejecución.

No puede implementar archivos de sitios arbitrarios, alterar la distribución de CloudFront ni exponer el cubo de S3. EventBridge recibe permiso para invocar esta función específica de la regla programada específica.

El sitio en sí mismo permanece privado. CloudFront utiliza Origin Access Control para enviar solicitudes firmadas a S3, lo que impide que los espectadores se salten la distribución y traten el depósito como un servidor de archivos público.

El mapa público es intencionalmente menos preciso

Un panel más detallado no es automáticamente un mejor panel público. Los marcadores urbanos tienen un aspecto impresionante, pero los recuentos pequeños combinados con una marca horaria precisa y una persona conocida pueden convertirse en identificativos. Los totales a nivel de país bastan para contar la historia mundial del sitio sin pretender que la telemetría de la infraestructura demuestre dónde vive un lector específico.

El diseño visual refuerza esa limitación. El mapa muestra la intensidad por país y una clasificación, mientras que una explicación justo debajo dice que las solicitudes son señales más que personas. La interfaz no ofrece un análisis detallado de los eventos individuales.

Esa distinción es importante porque los gráficos pulidos pueden crear una falsa certeza. Un país derivado de la IP es una observación hecha por una plataforma perimetral. Las VPN, las redes corporativas, los operadores de telefonía móvil, los rastreadores y las vistas previas en caché complican la historia humana detrás de esto.

El coste sigue al volumen de escaneado, no a la complejidad visual

El mapa y los gráficos se renderizan en el navegador con el código ya publicado en el sitio estático, por lo que su complejidad visual no crea una lista de renderizado en el servidor. El coste operativo significativo proviene de la recopilación y retención de registros, la ingesta de métricas y el análisis de los datos de registro con consultas programadas.

Por lo tanto, los controles son arquitectónicos más que estéticos:

  • una política de retención de registros de 30 días impide el crecimiento indefinido;
  • la función solo funciona cuatro veces al día;
  • consultas, solicitudes, intervalos de tiempo limitados y solo los campos obligatorios;
  • los rangos gráficos más largos utilizan períodos métricos más gruesos;
  • el archivo JSON publicado es pequeño en comparación con los registros de origen.

El tiempo de ejecución de Lambda y el almacenamiento en S3 para un documento compacto son insignificantes a esta escala. El volumen de escaneo de Logs Insights es el componente que vale la pena observar si el tráfico o la retención aumentan sustancialmente.

Lo que me enseñó la implementación

Estático no significa ciego. La observabilidad puede vivir junto a un sitio estático sin pasar a su ruta de solicitud sincrónica.

La agregación es un límite de seguridad. La transformación de los registros de operaciones a un documento público debe ser explícita, revisada y unidireccional.

Lo suficientemente fresco es mejor que falsamente en tiempo real. Una instantánea de seis horas coincide con el retraso de los registros de acceso estándar y evita trabajos innecesarios.

El fracaso debe preservar la verdad anterior. Es preferible una instantánea obsoleta a una página de inicio que no funcione porque el servicio de análisis no está disponible.

Explique los límites junto a la tabla. Una visualización pública necesita un contexto sobre los bots, las solicitudes repetidas, la inferencia geográfica y la diferencia entre el tráfico y las personas.

Cuándo elegiría un diseño diferente

Este patrón funciona bien en un sitio personal con un tráfico moderado y un número reducido de visitas predeterminadas. Lo reconsideraría si los usuarios necesitaran consultas arbitrarias, paneles autenticados, frescura de segundo nivel o grandes conjuntos de datos multidimensionales. Esos requisitos podrían justificar una API, una tienda de análisis dedicada o una plataforma de visualización gestionada.

Para esta cartera, esas incorporaciones resolverían un problema que no tengo. Una función programada y otro documento estático conservan las cualidades que hicieron que el sitio fuera atractivo en primer lugar: una superficie de ataque pequeña, un comportamiento predecible y componentes con los que es fácil razonar.

Última comida para llevar

La parte más importante de este panel de visitantes no es el mapa mundial. Es el límite detrás de él.

Los datos detallados de las solicitudes permanecen en el entorno operativo. Un proceso con menos privilegios lo convierte periódicamente en agregados anónimos. El sitio web solo recibe una instantánea estática compacta y el navegador convierte esa instantánea en una historia.

Eso le da un pulso al sitio sin darle un corazón dinámico y vulnerable.

Referencias

BERND KUHLEN · NOTAS DE CAMPO SOBRE INGENIERÍA EN LA NUBE
ES
EnglishENDeutschDEEspañolES中文ZH