Casos reales de R2
Dónde gana R2 su sueldo: servir imágenes y assets como origen de una CDN sin pagar egress, guardar copias de seguridad que se restauran gratis, sostener un data lake barato de Parquet que motores externos consultan sin peaje, y encajar como reemplazo compatible de S3 en herramientas que ya tienes. Cuatro patrones distintos unidos por una misma causa económica —el egress cero— que los vuelve viables.
Ya conoces la máquina: qué es un objeto, los cinco verbos del binding, el multipart para lo grande, el acceso público y las llaves presignadas. Falta la pregunta que ordena todo lo demás —¿para qué se usa R2 en producción?—. No es una lista de anécdotas: los casos donde R2 brilla comparten una raíz común, y verla es entender por qué esta pieza existe. Servir medios, guardar backups, sostener un lago de datos, reemplazar a S3 bajo tus herramientas: cuatro patrones muy distintos que se vuelven baratos o directamente posibles por la misma causa, el egress que no se cobra. Este recorrido cierra el nivel conectando la mecánica con la economía.
- Diseñar un servidor de imágenes y assets con R2 como origen y la caché del edge delante.
- Justificar por qué el egress cero abarata las copias de seguridad y, sobre todo, su restauración.
- Reconocer R2 como base de un data lake barato consultable por motores externos.
- Encajar R2 como reemplazo compatible de S3 bajo herramientas y SDK que ya usas.
Imágenes y assets
R2 como origen, dominio propio y caché del edge delante. Servir un catálogo visto millones de veces no añade coste de transferencia.
Backups
Copias que se guardan baratas y —lo raro— se restauran gratis. Sin peaje de salida, recuperar un tera no arruina el mes.
Data lake barato
Parquet en el bucket, consultado por motores externos. El análisis lee sin pagar egress por cada barrido de la tabla.
Reemplazo de S3
Apuntas rclone, aws-sdk o boto3 al endpoint de R2. Tus herramientas siguen igual; cambia la factura.
Servir imágenes y assets
El caso de manual. Un catálogo de fotos, los avatares de una red, el CSS y el JavaScript de un sitio: bytes inmutables, numerosos, leídos muchas más veces de las que se escriben. Aquí es donde el egress de la nube clásica muerde con más saña, porque el coste crece con la popularidad —cuanto más éxito tiene tu contenido, más pagas por servirlo—. R2 corta esa correlación de raíz.
El montaje canónico pone R2 como origen tras un dominio propio, con la caché del edge por delante. La primera petición de cada objeto lo trae del bucket; las siguientes las sirve la caché desde el punto de presencia más cercano, sin volver a tocar R2. Con una cache-control generosa —los assets con hash en el nombre son inmutables y caducan lejísimos—, la enorme mayoría del tráfico ni siquiera llega al almacén, y el que llega no paga salida.
Cuando necesitas lógica —autorizar quién ve una imagen privada, elegir una variante— pones un Worker delante que decide y sirve el objeto en streaming, como viste con get:
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const clave = new URL(request.url).pathname.slice(1);
if (!(await autorizado(request, env))) return new Response("prohibido", { status: 403 });
const obj = await env.BUCKET.get(clave);
if (obj === null) return new Response("no encontrado", { status: 404 });
const headers = new Headers();
obj.writeHttpMetadata(headers);
headers.set("cache-control", "public, max-age=31536000, immutable");
return new Response(obj.body, { headers });
},
} satisfies ExportedHandler<Env>;
El patrón es un gradiente: caché pura para lo público y cacheable, Worker con get para lo que pide control, y siempre R2 como el origen barato del que todo cuelga.
flowchart LR Cliente[cliente] --> Cache[cache del edge] Cache -- acierto --> Cliente Cache -- fallo --> Worker[worker autoriza y sirve] Worker --> R2[R2 origen sin egress] R2 --> Worker --> Cache style R2 fill:#a6e3a1,color:#11111b
Con la caché por delante, activar Smart Tiered Cache hace que un único centro de datos superior, situado junto a tu bucket, absorba los fallos de caché de todos los demás. Así R2 recibe como mucho una petición por objeto frío en lugar de una por cada región, y el origen —ya de por sí sin egress— se toca lo mínimo. Rendimiento y coste tiran en la misma dirección.
Backups y un data lake barato
Las copias de seguridad tienen una asimetría cruel en la nube tradicional: guardarlas es barato, pero restaurarlas —justo cuando más lo necesitas, en plena crisis— dispara la factura de egress al sacar todo el volumen de golpe. Es un backup que castiga usarlo. En R2 ese castigo desaparece: almacenar es económico y recuperar no cuesta transferencia, así que un plan de recuperación deja de tener una multa incorporada. Herramientas como rclone vuelcan directorios enteros al bucket con un comando, eligiendo multipart solas para los ficheros grandes.
# Copia incremental de un directorio al bucket, via API S3 de R2.
rclone copy ./datos r2:mi-bucket/backups/2026-07-30 --transfers=8
Y como los backups envejecen, R2 deja definir reglas de ciclo de vida que caducan objetos por antigüedad —borra lo de hace más de noventa días, aborta las subidas incompletas— sin que un cron tuyo tenga que barrer el bucket. La retención se declara una vez y la plataforma la aplica sola, de modo que el almacén no crece sin freno con copias que ya nadie necesita.
El data lake es la misma economía llevada al análisis. Depositas datos en formato columnar —Parquet— sobre el bucket, particionados por fecha o por clave, y dejas que un motor los consulte: R2 SQL, DuckDB, Spark, o un catálogo Iceberg gestionado como R2 Data Catalog. La clave económica se repite: un motor analítico barre volúmenes enormes una y otra vez, y en la nube clásica cada barrido paga egress si el cómputo y el almacén viven separados. Con R2 el barrido no paga salida, y un lago de datos que en otro proveedor sería caro de consultar se vuelve asequible de explotar.
// Escribir una particion Parquet del dia; luego la consulta un motor externo.
await env.LAKE.put(`eventos/fecha=2026-07-30/parte-001.parquet`, buffer, {
httpMetadata: { contentType: "application/vnd.apache.parquet" },
storageClass: "InfrequentAccess",
});
Para backups y particiones antiguas de un lago —datos que guardas por si acaso pero rara vez tocas— la clase Infrequent Access rebaja el coste de almacenamiento a cambio de un pequeño cargo de recuperación. Es la palanca correcta cuando el objeto vive meses en reposo y solo se lee en una restauración o una consulta esporádica; para lo que se sirve a diario, en cambio, la clase Standard sale mejor.
El reemplazo compatible de S3
El cuarto caso no es una aplicación nueva sino una sustitución silenciosa. Como R2 implementa la API de S3, cualquier herramienta que hable ese idioma —y son legión: clientes de backup, motores de datos, CLIs, los SDK oficiales en todos los lenguajes— apunta a R2 cambiando el endpoint y las credenciales, sin tocar una línea de su lógica.
// El mismo cliente de S3 de siempre, apuntando a R2.
const s3 = new S3Client({
region: "auto",
endpoint: `https://${env.ACCOUNT_ID}.r2.cloudflarestorage.com`,
credentials: { accessKeyId: env.R2_KEY_ID, secretAccessKey: env.R2_SECRET },
});
Con region: "auto" y ese endpoint, boto3, aws-sdk o rclone creen que hablan con S3. Esto vuelve la migración un ejercicio de configuración, no de reescritura, y —más sutil— te da una salida: adoptar R2 no te encierra, porque el mismo código que lo usa serviría contra cualquier otro almacén compatible. La compatibilidad, que en la lección uno era la vía de entrada, es también la garantía de que la puerta de salida sigue abierta.
Hay un matiz operativo que conviene recordar. Wrangler sube ficheros de hasta unos cientos de megabytes y de uno en uno; para volúmenes grandes o cargas masivas, la vía correcta es una herramienta S3-compatible como rclone, que trocea, paraleliza y reanuda por ti. Elegir la herramienta según el tamaño del trabajo es parte del oficio.
Resiste la tentación de guardar estos cuatro patrones como recetas sueltas, porque son el mismo teorema demostrado cuatro veces. Servir medios, restaurar backups, consultar un lago, migrar desde S3: en los cuatro, lo que en la nube clásica dolía era mover los bytes —hacia el usuario, hacia el disco de recuperación, hacia el motor de análisis, hacia otro proveedor— y en los cuatro R2 hace ese movimiento gratis. Une los puntos y aparece la tesis estratégica que corona el nivel. En el modelo tradicional, el egress era un imán que fijaba los datos en su sitio y obligaba a todo lo demás a acercarse a ellos: el cómputo peregrinaba hacia el almacén porque llevarse el almacén era ruinoso, y esa gravedad decidía arquitecturas enteras. R2 no rebaja el imán, lo apaga. Y cuando el coste de leer y de sacar cae a cero, la lógica se invierte: los datos dejan de ser un pozo pesado del que nada quiere salir y se vuelven un punto neutral desde el que todo puede fluir libremente —a la CDN, a tu portátil en una restauración, a Spark, a otra nube—. R2 aspira a ser el centro de gravedad al que conviene traer los datos precisamente porque no te castiga por sacarlos, la paradoja de un imán que atrae por no retener. Para el ingeniero, la consecuencia práctica es un cambio de pregunta. Deja de calcular cuánto costará que este dato sea leído, servido o analizado —en R2 esa columna es cero— y empieza a diseñar como si leer fuera libre: sirve sin miedo al éxito, respalda pensando en la restauración y no solo en el guardado, analiza a placer, y elige la portabilidad sin pagar rescate. El nivel entero, desde qué es un objeto hasta este último caso, converge aquí: la mecánica de R2 es corriente y compatible a propósito; lo que no es corriente es su economía, y esa economía, una vez interiorizada, reordena cómo piensas dónde viven los datos y qué eres libre de hacer con ellos.
- Diseña el servicio de imágenes de una app: dominio propio,
cache-control, y en qué punto exacto meterías un Worker congetpara servir variantes o material privado. - Compara el coste de restaurar un backup de un terabyte en una nube con egress frente a R2, y explica por qué la asimetría entre guardar y restaurar es la que R2 corrige.
- Esboza un data lake de eventos en Parquet particionado por fecha sobre R2, nombra un motor que lo consultaría, y decide qué particiones pondrías en la clase fría.
- Toma una herramienta que uses hoy contra S3 y describe los dos únicos cambios —endpoint y credenciales— para apuntarla a R2, y qué te dice eso sobre el lock-in.
- Formula con tus palabras el teorema del nivel: qué única propiedad económica vuelve viables los cuatro casos, y cómo invierte la gravedad de los datos.