Después de catorce capítulos contando lo que me funciona, toca lo contrario. Cloudflare es mi opción por defecto para proyectos personales y de I+D, pero no para todo. Estos son los casos en los que elegiría otra cosa, con el porqué y la alternativa.
Para quién es
Para quien está decidiendo la plataforma de un proyecto nuevo o se pregunta si llevar uno existente a Cloudflare.
Al terminar tendrás los casos en los que yo elegiría otra cosa, cuánta dependencia del proveedor asumes con cada pieza y una lista de comprobación para pasar de la idea a producción.
Cuándo elegiría otra cosa
flowchart TD
A[Proyecto nuevo] --> B{¿Más de 128 MB por petición<br/>o CPU constante?}
B -->|Sí| C{¿Cabe en un contenedor<br/>pequeño y a ratos?}
C -->|Sí| CT[Cloudflare Containers]
C -->|No| VM[Servidor o PaaS<br/>con máquina dedicada]
B -->|No| D{¿Todo lo demás<br/>ya está en AWS?}
D -->|Sí| AWS[Lambda y servicios de AWS]
D -->|No| E{¿Base relacional<br/>grande y única?}
E -->|Sí| PG[Workers + Hyperdrive + Postgres]
E -->|No| CF[Workers + D1 + R2]
| Caso | Por qué no Cloudflare (solo) | Qué usaría |
|---|---|---|
| Mucha memoria o CPU constante (vídeo, compilaciones, modelos propios) | 128 MB por isolate; la CPU se paga por milisegundo | Containers, o una máquina dedicada si es 24/7 |
| El resto de la empresa está en AWS (datos, permisos, equipos) | Tráfico entre nubes, dos sistemas de permisos, dos facturas | Lambda y los servicios de AWS |
| Una base relacional grande y con muchas escrituras | 10 GB por base de datos en D1 | Postgres gestionado (con Hyperdrive si el código sigue en Workers) |
| Librerías que necesitan Node.js completo o binarios nativos | La compatibilidad es amplia, no total | Containers o un servidor Node |
| Procesos de horas sin pasos intermedios | Límites de CPU y duración | Containers, o colas en otra plataforma |
| Residencia de datos o certificaciones muy concretas | Hay opciones (Data Localization Suite), pero en planes Enterprise | El proveedor que ya cumpla el requisito |
Containers: la salida sin salir
Cloudflare Containers ejecuta una imagen de contenedor (con Linux, más memoria y cualquier binario) controlada desde un Worker y un Durable Object. Sirve para el caso “todo me cabe en Workers menos esta pieza”. Así encajan las piezas:
flowchart LR
P[Petición] --> W[Worker]
W --> DO[Durable Object<br/>arranca y controla el contenedor]
DO --> C[Contenedor<br/>Linux, más memoria, cualquier binario]
Solo está en el plan de pago y se cobra por uso:
| Recurso | Incluido al mes | Después |
|---|---|---|
| Memoria | 25 GiB-hora | 0,0000025 $ por GiB-segundo |
| CPU | 375 vCPU-minutos | 0,00002 $ por vCPU-segundo |
| Disco | 200 GB-hora | 0,00000007 $ por GB-segundo |
| Salida de datos (Norteamérica y Europa) | 1 TB | 0,025 $ por GB |
Workers, Lambda o un servidor: comparación rápida
| Cloudflare Workers | AWS Lambda | Servidor o PaaS (VPS, Fly, Railway…) | |
|---|---|---|---|
| Arranque | Milisegundos | De ~100 ms a segundos | Siempre encendido |
| Regiones | Toda la red, sin elegir | Una región por función | Las que contrates |
| Coste en reposo | 0 $ | 0 $ | Lo que cueste la máquina |
| Memoria máxima | 128 MB | Hasta 10 GB | La de la máquina |
| Salida de datos | Gratis | Se paga | Según el proveedor |
| Ecosistema | Creciendo, integrado | El más amplio | Cualquier cosa |
| Cuándo | Proyectos nuevos, APIs, webs, I+D | Empresas ya en AWS | Cargas constantes o software que no cabe en serverless |
La comparación detallada, con costes para el mismo tráfico, está en Workers frente a Lambda (próximamente).
Cuánta dependencia del proveedor asumes
No todas las piezas atan igual. Así lo veo yo:
| Pieza | Dependencia | Por qué |
|---|---|---|
| Hono / tu código HTTP | Baja | Hono funciona en Node, Deno, Bun y Lambda |
| R2 | Baja | API compatible con S3: cambias el endpoint |
| D1 | Baja-media | Es SQLite: exportas y lo cargas en otro sitio. Las consultas cambian poco si vas a Postgres |
| KV | Media | Fácil de sustituir por Redis, pero con otra semántica de consistencia |
| Queues | Media | El patrón es estándar; el código del consumidor cambia poco |
| Workers AI / AI Gateway | Baja | Los modelos son abiertos y el gateway admite otros proveedores |
| Durable Objects | Alta | No hay un equivalente directo en otras nubes |
| Workflows | Alta | Hay alternativas (Temporal, Step Functions), pero hay que reescribir |
Lista de comprobación: de la idea a producción
Lo que reviso antes de abrir una aplicación al público, con el capítulo de cada punto:
- Dominio propio con DNSSEC y SSL en modo estricto (cap. 2).
-
tscy pruebas antes de cada despliegue (cap. 3). - Secretos con
wrangler secret put; nada en el repositorio. - Migraciones compatibles hacia atrás y una copia exportada antes de las arriesgadas (cap. 5).
- Autorización en cada consulta, también en R2 y Vectorize.
- Trabajo pesado en colas o Workflows, con cola de mensajes muertos (cap. 7).
- SPF, DKIM y DMARC si envías correo (cap. 8).
- Turnstile en formularios públicos y limitación en el login (cap. 11).
- Logs, Issues y alertas de errores y de facturación (cap. 12).
- Límites de gasto en el código:
max_tokens,max_retries, tamaños máximos (cap. 13). - Staging y previews protegidos con Access; vuelta atrás probada (cap. 14).
Resumen
- Cloudflare para proyectos nuevos, APIs, webs, SaaS pequeños y prototipos de I+D.
- Containers para la pieza que no cabe en un Worker; otra plataforma si es la mayor parte del sistema.
- La dependencia del proveedor se concentra en Durable Objects y Workflows: úsalos donde aporten.
- Con la lista de comprobación, la aplicación de la guía está lista para producción.
Recursos
- Containers
- Compatibilidad con Node.js en Workers
- Cómo elegir dónde guardar los datos
- Workers frente a Lambda para un proyecto pequeño (próximamente)
