aws.crafter.run

CloudFront

Amazon CloudFront

La red de caché que se pone delante de todo lo demás: acerca el contenido al usuario, absorbe el tráfico que tu origen no tendría por qué ver, y decide su utilidad con una sola cosa — la clave de caché.

Verificado el
Ver .md

Los tres conceptos

Si no entiendes estos tres, nada de lo demás encaja.

  1. 1

    La clave de caché lo decide todo

    CloudFront guarda una copia por cada combinación distinta de lo que incluyes en la clave: ruta, y las cabeceras, cookies y query strings que declares. Cada elemento que añades multiplica las variantes y divide tu tasa de acierto. Reenviar todas las cookies al origen es, en la práctica, desactivar la caché.

  2. 2

    Invalidar es el último recurso

    Se puede, pero está limitado a 150 rutas por segundo y una invalidación con comodín por segundo, y no es instantáneo. La forma correcta de publicar contenido nuevo es cambiar el nombre del archivo — un hash en la ruta — para que la URL nueva no tenga nada que invalidar.

  3. 3

    Es el sitio más barato para ejecutar lógica

    CloudFront Functions corre en el edge con 10 KB de código y 2 MB de memoria, para reescribir URLs, cabeceras y redirecciones. Lambda@Edge es su hermano grande — 30 segundos de timeout, acceso a la red— y cuesta bastante más. Casi todo lo que se pone en Lambda@Edge cabe en una Function.

Los límites

Hard es un muro: no se sube ni con un ticket. Soft se amplía pidiéndolo — antes del pico, no durante.

ConceptoValorTipo
Peticiones por segundo y distribución250 000soft
Transferencia por distribución150 Gbpssoft
Distribuciones por cuenta500soft
Nombres de dominio alternativos (CNAME) por distribución100soft
Cache behaviors por distribución75soft
Orígenes por distribución100 · 10 grupos de origensoft
Timeout de respuesta del origenTambién llamado origin read timeout. La conexión va de 1 a 10 s.de 1 a 120 segundossoft
Archivo cacheable máximoSolo se cachean respuestas a GET. Las de POST y PUT nunca.50 GBhard
Cuerpo de petición máximo64 GBhard
Longitud de la petición sin cuerpoCabeceras y query strings sumadas. La URL sola, 8 192 bytes.32 768 byteshard
Rango de compresiónFuera de ese rango CloudFront no comprime, aunque se lo pidas.de 1 000 a 10 000 000 byteshard
Invalidaciones150 rutas o tags por segundo · 1 comodín por segundohard
Distribuciones encadenadasPoner una distribución delante de otra más allá de eso devuelve 403.2hard
CloudFront FunctionsEl tamaño no se amplía. Para más datos, un key value store.10 KB de código · 2 MB de memoria · 100 por cuentahard
Lambda@Edge · timeout30 segundoshard
Lambda@Edge · respuesta generada40 KB en viewer · 1 MB en originhard
Cabeceras, cookies y query strings por política de cachéY 1 024 caracteres sumando todos los nombres.10 de cadasoft
Políticas de caché o de origin request personalizadas20 por cuentasoft
Certificados SSL por distribución1hard
Timeout de inactividad en WebSocket10 minutoshard

Modelo mental

CloudFront es una caché con cientos de sedes. Un usuario de Lima pide un archivo, la sede más cercana mira si lo tiene, y si lo tiene se lo da sin que tu origen se entere de que ha existido esa petición.

Clave = ruta + cookie de sesión/foto.jpgsesión=a1/foto.jpgsesión=b2/foto.jpgsesión=c33 copias distintas0 % de aciertoorigen3 peticioneslas tres van al origenClave = solo la ruta/foto.jpgtres usuarios1 copia2 de 3 aciertosorigen1 peticiónsolo la primeraLa política de caché define la clave · la de origin request, lo que ve el origen sin crear variantes
Cada cosa que metes en la clave multiplica las copias y divide tu tasa de acierto. Reenviar todas las cookies al origen no es una configuración conservadora: es desactivar la caché y pagar además un salto de red.

Todo el servicio se reduce a esa pregunta —¿lo tengo?— y la respuesta la decide la clave de caché.

La clave de caché es el servicio

La clave se construye con la ruta más lo que tú declares: cabeceras, cookies, query strings. Y CloudFront guarda una copia por cada combinación distinta.

Un ejemplo hace la aritmética evidente. Si incluyes en la clave la cabecera Accept-Language (20 valores plausibles), una cookie de sesión (un valor por usuario) y dos query strings de paginación, no tienes una caché: tienes tantas copias como usuarios, y la tasa de acierto tiende a cero. Cada petición viaja al origen igual que antes, pero ahora pagando CloudFront además.

De ahí la regla que resume el servicio: cuanto menos incluyas en la clave, más sirve. Y por eso conviene separar dos cosas que la gente confunde:

Si tu origen necesita ver una cabecera pero esa cabecera no debería crear variantes, va en la segunda, no en la primera.

No invalides: versiona

Invalidar existe, funciona y es la respuesta equivocada casi siempre. Está limitado a 150 rutas por segundo y una invalidación con comodín por segundo, y tarda en propagarse.

La alternativa es no tener nada que invalidar: si el archivo nuevo se llama app.9f2c1a.js, es una URL que nunca ha estado en caché y la vieja puede seguir donde estaba hasta que caduque. Es lo que hace cualquier bundler moderno, y es la razón por la que puede.

Cómo te factura

Concepto Cómo se paga
Transferencia de salida por GB, y varía por región geográfica
Peticiones por 10 000, HTTP y HTTPS por separado
Invalidaciones las primeras 1 000 rutas al mes gratis, luego por ruta
CloudFront Functions por invocación, muy barato
Lambda@Edge por petición y por duración, bastante más caro

La razón económica principal para poner CloudFront delante de S3 no es la latencia: es que la salida de datos desde CloudFront cuesta menos que desde S3 y, sobre todo, que las peticiones que sirve la caché no llegan a tu origen — así que no pagas ni la petición de S3, ni la invocación de Lambda, ni la transferencia.

Con una tasa de acierto alta, CloudFront se paga solo. Con una tasa de acierto baja —por una clave de caché mal diseñada— es un coste añadido sin contrapartida. La métrica que importa es esa, y hay que mirarla.

Cuándo NO usarlo

Errores comunes

Reenviar todas las cookies o todas las cabeceras. Es la forma más rápida de desactivar la caché sin darse cuenta. Cada valor distinto es una copia distinta.

Confundir política de caché con política de origin request. Lo que el origen necesita ver y lo que debe crear variantes son dos listas diferentes.

Invalidar en cada despliegue. Además de lento y limitado, oculta el problema real: los nombres de archivo no llevan versión.

Dejar el bucket público “porque hay CloudFront delante”. La configuración correcta es Origin Access Control: el bucket privado y solo CloudFront con permiso. Si no, el bucket sigue siendo accesible directamente y toda la caché es opcional para quien conozca la URL.

Esperar que se cacheen los POST. Solo se cachean respuestas a GET.

Suponer que comprime siempre. CloudFront comprime en el rango de 1 000 a 10 000 000 bytes. Un archivo de 400 bytes o de 20 MB viaja sin comprimir.

Encadenar distribuciones. El máximo son 2 en la cadena hasta el origen; pasarse devuelve 403.

Ir a Lambda@Edge para reescribir una URL. Eso cabe en una CloudFront Function, que cuesta una fracción y se ejecuta en el edge sin arrancar nada. Los 10 KB de código dan para mucho más de lo que parece.

Fuentes

Peticiones por segundo, transferencia, distribuciones, CNAMEs, cache behaviors, orígenes, timeouts, tamaño máximo cacheable, longitud de petición y URL, rango de compresión, límites de invalidación, distribuciones encadenadas, CloudFront Functions, Lambda@Edge, políticas de caché y de origin request, certificados y timeout de WebSocket: Quotas — Amazon CloudFront. Los modelos de precio proceden de la página de precios de AWS, que se renderiza dinámicamente y no pudo citarse literalmente.

Dónde aparece esto

Todavía ningún patrón escrito lo usa.