[{"data":1,"prerenderedAt":1087},["ShallowReactive",2],{"blog-es-\u002Fes\u002Fblog\u002Fsalir-de-aws-sin-reescribir-el-stack":3,"blog-es-surround-\u002Fes\u002Fblog\u002Fsalir-de-aws-sin-reescribir-el-stack":1073},{"id":4,"title":5,"author":6,"body":7,"category":1053,"cover":1054,"date":1055,"description":1056,"draft":1057,"extension":1058,"lastReviewed":1054,"meta":1059,"navigation":1060,"path":1061,"readingTime":1062,"seo":1063,"sitemap":1064,"stem":1065,"tags":1066,"__hash__":1072},"blog_es\u002Fes\u002Fblog\u002Fsalir-de-aws-sin-reescribir-el-stack.md","Cómo salir de AWS sin reescribir todo el stack: guía práctica 2026","Equipo HeroCtl",{"type":8,"value":9,"toc":1013},"minimark",[10,14,19,22,25,32,35,39,42,45,48,52,55,131,134,138,141,354,357,362,365,368,372,380,383,386,392,396,399,402,406,409,416,419,423,426,429,433,436,439,443,446,450,453,456,460,463,466,469,473,476,487,490,494,497,500,504,507,513,519,522,526,529,535,541,551,557,563,569,575,581,585,588,620,624,627,632,670,675,706,709,712,716,719,722,739,742,745,749,752,758,764,770,776,780,783,797,800,804,807,810,835,838,853,856,858,862,866,869,873,876,880,883,887,893,897,916,920,923,927,930,934,937,941,944,946,950,953,956,989,992,1006,1009],[11,12,13],"p",{},"La mayoría de los equipos que piensa en salir de AWS lo posterga indefinidamente porque cree estar ante un proyecto de \"reescribir todo el stack\". No lo es. Es un proyecto de mapeo, no de reescritura. Y el mapeo cabe en una hoja de cálculo de doce líneas.",[15,16,18],"h2",{"id":17},"tldr-lo-que-vas-a-leer-en-tres-minutos","TL;DR — lo que vas a leer en tres minutos",[11,20,21],{},"Stack típico de SaaS usa cerca de doce servicios AWS, y cada uno de ellos tiene alternativa portable que cuesta entre tres y siete veces menos. EC2 se vuelve VPS en cualquier proveedor (Hetzner, DigitalOcean, Magalu Cloud). RDS se vuelve Postgres en VPS dedicado, Neon o Supabase. ElastiCache se vuelve Valkey auto-hospedado. S3 se vuelve CloudFlare R2 o Backblaze B2 — ambos con API S3-compatible, así que el código ni cambia. SQS se vuelve cola basada en Redis o RabbitMQ. Lambda se vuelve endpoint en el app server tradicional o CloudFlare Workers. ALB se vuelve el router integrado del orquestador. CloudFront se vuelve CloudFlare gratis. IAM se vuelve inyección de secretos en el orquestador.",[11,23,24],{},"Cronograma realista para startup con cinco a diez aplicaciones: seis a ocho semanas, ochenta a ciento sesenta horas de desarrollo. Ahorro típico: tres a siete veces en la cuenta de infra, con retorno en menos de un mes de salario sénior.",[11,26,27,31],{},[28,29,30],"strong",{},"No migres si"," tu cumplimiento exige AWS nominalmente, si el equipo es único y se enfoca en producto, o si el stack usa lock-in profundo (DynamoDB con features específicas, Aurora Serverless v2, IAM cross-account complejo).",[11,33,34],{},"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━",[15,36,38],{"id":37},"por-que-tantos-equipos-posponen-la-salida-de-aws","¿Por qué tantos equipos posponen la salida de AWS?",[11,40,41],{},"La respuesta honesta es confusión entre dos proyectos diferentes. \"Salir de AWS\" se volvió sinónimo mental de \"reescribir la aplicación\". No es la misma cosa.",[11,43,44],{},"Reescribir la aplicación es cambiar tecnología central — base relacional por NoSQL, framework síncrono por reactivo, monolito por microservicios. Eso sí toma trimestres. Salir de AWS es cambiar la infra que sostiene la aplicación que ya tienes. El código de dominio queda idéntico. Cambian endpoints de base, credenciales, algunos SDKs y la forma de declarar deploy.",[11,46,47],{},"La confusión dura porque el equipo mira la consola de AWS y ve doscientos servicios. Nadie usa doscientos. La mayor parte usa doce. Mapea esos doce, encuentra alternativa para cada uno, y lo que queda es trabajo de ejecución — no de investigación.",[15,49,51],{"id":50},"los-doce-servicios-aws-que-tu-stack-probablemente-usa","Los doce servicios AWS que tu stack probablemente usa",[11,53,54],{},"La hoja de cálculo de inicio es esa. Todo lo que está fuera de ella en tu cuenta probablemente es satélite — alarma del CloudWatch que nadie mira, bucket S3 olvidado, función Lambda muerta. Enfócate en los doce:",[56,57,58,65,71,77,83,89,95,101,107,113,119,125],"ol",{},[59,60,61,64],"li",{},[28,62,63],{},"EC2"," — máquinas virtuales que corren app server y workers",[59,66,67,70],{},[28,68,69],{},"RDS"," — base relacional gestionada (Postgres o MySQL)",[59,72,73,76],{},[28,74,75],{},"ElastiCache"," — Redis para caché y sesión",[59,78,79,82],{},[28,80,81],{},"S3"," — almacenamiento de objetos (uploads, backups, assets)",[59,84,85,88],{},[28,86,87],{},"ALB \u002F NLB"," — balanceador de carga al frente de las EC2",[59,90,91,94],{},[28,92,93],{},"CloudFront"," — CDN para assets estáticos",[59,96,97,100],{},[28,98,99],{},"Route 53"," — DNS autoritativo",[59,102,103,106],{},[28,104,105],{},"SES"," — email transaccional",[59,108,109,112],{},[28,110,111],{},"SQS \u002F SNS"," — cola y pub-sub",[59,114,115,118],{},[28,116,117],{},"IAM"," — credenciales y roles para que servicios conversen",[59,120,121,124],{},[28,122,123],{},"CloudWatch"," — métricas y logs",[59,126,127,130],{},[28,128,129],{},"Lambda"," — funciones serverless",[11,132,133],{},"Si tu cuenta tiene los doce, felicitaciones: eres el stack mediano. Si tiene ocho o nueve, mejor — menos cosas para migrar. Si tiene cinco servicios muy específicos (Aurora Global, DynamoDB con Streams, EventBridge complejo), estás en un camino diferente — lee la sección de lock-ins antes de continuar.",[15,135,137],{"id":136},"mapeo-servicio-por-servicio-alternativa-coste-y-complejidad","Mapeo servicio por servicio — alternativa, coste y complejidad",[11,139,140],{},"La tabla abajo es el atajo. Cada línea tiene detalle expandido después.",[142,143,144,166],"table",{},[145,146,147],"thead",{},[148,149,150,154,157,160,163],"tr",{},[151,152,153],"th",{},"Servicio AWS",[151,155,156],{},"Alternativa portable",[151,158,159],{},"Coste antes (US$\u002Fmes)",[151,161,162],{},"Coste después (US$\u002Fmes)",[151,164,165],{},"Complejidad migración",[167,168,169,187,204,220,235,251,265,280,295,311,324,338],"tbody",{},[148,170,171,175,178,181,184],{},[172,173,174],"td",{},"EC2 t3.medium",[172,176,177],{},"VPS Hetzner CPX21",[172,179,180],{},"30",[172,182,183],{},"9",[172,185,186],{},"Baja",[148,188,189,192,195,198,201],{},[172,190,191],{},"RDS db.t4g.large",[172,193,194],{},"Postgres auto-hospedado o Neon",[172,196,197],{},"140",[172,199,200],{},"10–50",[172,202,203],{},"Media",[148,205,206,209,212,215,218],{},[172,207,208],{},"ElastiCache cache.t4g.micro",[172,210,211],{},"Valkey auto-hospedado",[172,213,214],{},"15",[172,216,217],{},"6",[172,219,203],{},[148,221,222,225,228,231,233],{},[172,223,224],{},"S3 (1TB + egress)",[172,226,227],{},"CloudFlare R2",[172,229,230],{},"120",[172,232,214],{},[172,234,186],{},[148,236,237,240,243,246,249],{},[172,238,239],{},"ALB",[172,241,242],{},"Router integrado del orquestador",[172,244,245],{},"22",[172,247,248],{},"0",[172,250,203],{},[148,252,253,255,258,261,263],{},[172,254,93],{},[172,256,257],{},"CloudFlare gratis",[172,259,260],{},"80",[172,262,248],{},[172,264,186],{},[148,266,267,269,272,275,277],{},[172,268,99],{},[172,270,271],{},"CloudFlare DNS",[172,273,274],{},"5",[172,276,248],{},[172,278,279],{},"Trivial",[148,281,282,284,287,290,293],{},[172,283,105],{},[172,285,286],{},"Resend o Postmark",[172,288,289],{},"10",[172,291,292],{},"15–20",[172,294,279],{},[148,296,297,299,302,305,308],{},[172,298,111],{},[172,300,301],{},"Redis Streams o RabbitMQ",[172,303,304],{},"16",[172,306,307],{},"0 (misma VPS)",[172,309,310],{},"Media–alta",[148,312,313,315,318,320,322],{},[172,314,117],{},[172,316,317],{},"Secretos del orquestador",[172,319,248],{},[172,321,248],{},[172,323,203],{},[148,325,326,328,331,334,336],{},[172,327,123],{},[172,329,330],{},"Prometheus + Loki",[172,332,333],{},"50",[172,335,307],{},[172,337,203],{},[148,339,340,342,345,348,351],{},[172,341,129],{},[172,343,344],{},"App server o CloudFlare Workers",[172,346,347],{},"40",[172,349,350],{},"0–12",[172,352,353],{},"Variable",[11,355,356],{},"Costes de antes asumen stack de SaaS pequeño-medio con cinco a diez aplicaciones activas.",[358,359,361],"h3",{"id":360},"ec2-se-vuelve-vps-en-cualquier-proveedor","EC2 se vuelve VPS en cualquier proveedor",[11,363,364],{},"La migración más obvia. EC2 t3.medium cuesta cerca de treinta dólares mensuales. Hetzner CPX21 con la misma clase de CPU y más RAM cuesta siete euros y noventa y nueve. DigitalOcean queda en el medio. Magalu Cloud es competitivo para quien prioriza factura en moneda local y dato en territorio nacional.",[11,366,367],{},"El camino técnico es provisionar la VPS, correr tu Ansible existente (o un script de bootstrap simple), copiar el snapshot del EC2 o subir la imagen desde cero. Para cada servidor, cuenta de dos a cuatro horas. No es la parte demorada de la migración.",[358,369,371],{"id":370},"rds-se-vuelve-postgres-auto-hospedado-o-neonsupabase","RDS se vuelve Postgres auto-hospedado o Neon\u002FSupabase",[11,373,374,375,379],{},"Aquí hay tres caminos honestos. El primero es Postgres corriendo en una VPS dedicada, con backup automatizado vía ",[376,377,378],"code",{},"pg_dump"," en cron y replicación física a un secundario en otra región. Cuesta el precio de la VPS — diez a veinte dólares mensuales — para sustituir un RDS de ciento cuarenta.",[11,381,382],{},"El segundo es Neon. Postgres serverless con branching, ramp-up automático, plan gratuito generoso, planes pagados a partir de cinco dólares. Útil para quien quiere abandonar AWS sin asumir operación directa de base.",[11,384,385],{},"El tercero es Supabase, que entrega Postgres con APIs adicionales (auth, realtime, storage) y tier gratuito permanente. Tiene sentido para startups que toleran acoplamiento a Supabase a cambio de simplicidad.",[11,387,388,389,391],{},"La migración en sí es ",[376,390,378],{}," seguido de restore en el destino, con ventana de mantenimiento corta — o replicación lógica con cutover casi sin downtime si tu Postgres es versión 13 o superior. Cuatro a ocho horas dependiendo del tamaño de la base.",[358,393,395],{"id":394},"elasticache-se-vuelve-valkey-auto-hospedado","ElastiCache se vuelve Valkey auto-hospedado",[11,397,398],{},"Redis se volvió Valkey después del cambio de licencia en 2024 — fork mantenido por la Linux Foundation. Corre en cualquier VPS con dos clics. Seis dólares mensuales sustituyen el ElastiCache de quince.",[11,400,401],{},"La migración tiene dos etapas. Primera, levantar el cluster Valkey con Sentinel para failover automático. Segunda, poblar la caché — script que lee de AWS y graba en el destino, o simplemente dejar que la aplicación lo llene orgánicamente después del cutover (caché cold start de pocos minutos). Tres a seis horas de trabajo.",[358,403,405],{"id":404},"s3-se-vuelve-cloudflare-r2-o-backblaze-b2","S3 se vuelve CloudFlare R2 (o Backblaze B2)",[11,407,408],{},"Esa es la ganancia más inmediata. CloudFlare R2 cobra cero por el egreso — la rebanada más cara del S3 cuando sirves assets a usuarios. Quince centavos de dólar por GB almacenado, contra veintitrés centavos del S3 estándar. Backblaze B2 es una alternativa casi idéntica, con integración aún más barata para workloads de backup pesado.",[11,410,411,412,415],{},"La migración técnica es trivial: ",[376,413,414],{},"rclone copy s3:mi-bucket r2:mi-bucket"," en paralelo. Un terabyte transfiere alrededor de doce horas dependiendo de la banda. El código de la aplicación cambia exactamente una línea — el endpoint del cliente S3. Toda biblioteca AWS SDK acepta configuración de endpoint custom; R2 y B2 implementan el protocolo S3 idéntico.",[11,417,418],{},"Volumen típico de SaaS medio (cincuenta GB de uploads de usuario): US$15 mensuales en R2 contra US$120 en S3 con egreso activo. El ahorro paga una semana de trabajo de migración en el primer mes.",[358,420,422],{"id":421},"alb-se-vuelve-router-integrado-del-orquestador","ALB se vuelve router integrado del orquestador",[11,424,425],{},"Si estás usando ALB, es porque tienes varias EC2 detrás de él. La alternativa es el router embebido en el orquestador elegido — HeroCtl, Caddy, o el router embebido en otros stacks auto-hospedados. El orquestador descubre los contenedores corriendo, abre puerto, terminan TLS vía Let's Encrypt automático, distribuye tráfico.",[11,427,428],{},"La migración cambia la definición de target group AWS por una definición de ingress en el manifiesto del orquestador. Cuatro a ocho horas para entender las reglas correctas. Veintidós dólares mensuales ahorrados por balanceador, y el orquestador acepta cuantos hosts quieras sin cobro adicional.",[358,430,432],{"id":431},"cloudfront-se-vuelve-cloudflare-gratis","CloudFront se vuelve CloudFlare gratis",[11,434,435],{},"Ese merece una mención destacada. CloudFront cobra por GB transferido — quien sirve vídeo o descargas pesadas sangra. CloudFlare ofrece CDN global gratuita en el plan free, con caché configurable, mitigación básica de DDoS y WAF rudimentario. Para la mayor parte de los casos de SaaS, es más que suficiente.",[11,437,438],{},"La migración es cambiar los nameservers del dominio a CloudFlare y configurar reglas de caché. Dos a cuatro horas. El ahorro puede ser masivo — ochenta dólares mensuales para quien tiene volumen medio de tráfico, miles para quien tiene volumen alto.",[358,440,442],{"id":441},"route-53-se-vuelve-cloudflare-dns","Route 53 se vuelve CloudFlare DNS",[11,444,445],{},"DNS en CloudFlare es gratis y más rápido que Route 53 en la mayoría de las mediciones públicas. Migración es exportar la zone file, importar en CloudFlare, validar registros, cambiar nameservers en el registrar. Treinta minutos. Cinco dólares mensuales que vuelven a la caja.",[358,447,449],{"id":448},"ses-se-vuelve-resend-postmark-o-mailgun","SES se vuelve Resend, Postmark o Mailgun",[11,451,452],{},"AWS es barato para envío en volumen, pero la entregabilidad del SES exige calentamiento de IP y configuración de reputación que toma tiempo. Resend cobra veinte dólares por cincuenta mil emails mensuales y tiene entregabilidad superior fuera de la caja. Postmark cobra quince por diez mil. Mailgun cubre el caso de quien manda mucho volumen no-transaccional.",[11,454,455],{},"La migración es cambiar credenciales SMTP en el app — una hora de trabajo.",[358,457,459],{"id":458},"sqs-y-sns-se-vuelven-redis-streams-o-rabbitmq","SQS y SNS se vuelven Redis Streams o RabbitMQ",[11,461,462],{},"La migración más delicada. SQS es un servicio que hace una cosa y la hace bien; sustituir exige elegir tecnología de cola y refactorizar productor y consumidor.",[11,464,465],{},"El camino más corto es Redis Streams, principalmente si ya estás corriendo Valkey para caché. Bibliotecas como Sidekiq (Ruby), BullMQ (Node), RQ (Python) y Asynq (Go) consumen Redis nativamente. RabbitMQ es más robusto para escenarios de enrutamiento complejo. NATS es alternativa moderna para pub-sub.",[11,467,468],{},"Para cada cola, cuenta uno a tres días dependiendo de la complejidad. Colas simples de jobs background son triviales. Colas con fan-out, dead letter queues y visibility timeout customizado exigen más cuidado. Dieciséis dólares mensuales ahorrados, y la cola corre en la misma VPS que la caché — cero adicional en la infra.",[358,470,472],{"id":471},"iam-se-vuelve-secretos-del-orquestador","IAM se vuelve secretos del orquestador",[11,474,475],{},"Aquí está la migración no-obvia que pilla a muchos equipos experimentados en AWS desprevenidos. En AWS, la aplicación accede a S3 y RDS sin credenciales explícitas en el código — la EC2 hereda un IAM role y el SDK busca tokens automáticamente. Fuera de AWS, eso desaparece.",[11,477,478,479,482,483,486],{},"La solución es inyección de secretos por el orquestador. HeroCtl, k3s y similares aceptan secretos como recursos de primera clase — declaras ",[376,480,481],{},"DATABASE_URL"," o ",[376,484,485],{},"S3_ACCESS_KEY"," en el manifiesto del job y el orquestador inyecta como variable de entorno en el contenedor. Para escenarios más sofisticados, HashiCorp Vault auto-hospedado hace rotación automática.",[11,488,489],{},"La migración es refactorizar cada role IAM en un conjunto de credenciales explícitas, creadas en el proveedor de destino (CloudFlare API token, Postgres user específico, etc), y declaradas como secretos. Cuatro a ocho horas para un stack medio.",[358,491,493],{"id":492},"cloudwatch-se-vuelve-prometheus-loki","CloudWatch se vuelve Prometheus + Loki",[11,495,496],{},"Métricas se vuelven Prometheus + Grafana. Logs se vuelven Loki + Grafana. Todo corre en contenedores en el mismo cluster. Cincuenta dólares mensuales de CloudWatch se vuelven cero adicional.",[11,498,499],{},"La configuración inicial toma cerca de cuatro horas para volverse productiva: Prometheus con service discovery apuntando a los agentes del orquestador, Loki recibiendo vía Promtail o directamente del runtime de contenedor, Grafana con dashboards básicos. Hay posts dedicados a esa migración en el blog.",[358,501,503],{"id":502},"lambda-la-parte-mas-dificil","Lambda — la parte más difícil",[11,505,506],{},"Lambda es el servicio con la mayor varianza de complejidad en la migración. Depende totalmente de cómo la estés usando.",[11,508,509,512],{},[28,510,511],{},"Lambda HTTP simple"," (API Gateway → Lambda → respuesta) es trivial. Se vuelve endpoint en tu app server. El código de la función cambia poco — handler del framework en lugar del handler del Lambda. Una a dos horas por función.",[11,514,515,518],{},[28,516,517],{},"Lambda event-driven"," (S3 dispara Lambda, SQS dispara Lambda, EventBridge agenda Lambda) es la parte cara. Para eventos de S3, R2 ofrece eventos vía CloudFlare Workers — reescribes la Lambda como Worker y mantienes el patrón. Para SQS, se vuelve consumer en el app server. Para EventBridge agendado, se vuelve cron en el orquestador.",[11,520,521],{},"Escenario peor: Lambda compleja con EventBridge, Step Functions y dead letter queues encadenados. Aquí es redesign. Reserva una semana o dos y dibuja un modelo de eventos más simple — generalmente el sistema queda mejor.",[15,523,525],{"id":524},"cronograma-realista-de-seis-a-ocho-semanas","Cronograma realista de seis a ocho semanas",[11,527,528],{},"El orden importa. Empezar por la base es tentación y trampa — base es la última en migrar, no la primera.",[11,530,531,534],{},[28,532,533],{},"Semana 1 — Inventario y decisión."," Lista los doce servicios, anota coste actual, identifica integraciones entre ellos. Elige alternativa para cada uno. Documento de una página con la tabla de mapeo. Sin código aún.",[11,536,537,540],{},[28,538,539],{},"Semana 2 — Provisión del destino en paralelo."," Levanta las VPS, instala el orquestador (HeroCtl o similar), configura DNS de prueba apuntando a un subdominio. Sube Postgres, Valkey, CloudFlare R2. Todo vacío. Smoke test: un \"hello world\" corriendo.",[11,542,543,546,547,550],{},[28,544,545],{},"Semana 3 — Migración de storage."," S3 a R2 con ",[376,548,549],{},"rclone",". Suele ser lenta (volumen) pero bajísimo riesgo. Aplicación aún lee de S3, pero validas que R2 esté sincronizado. Al final de la semana, dual-write — aplicación escribe en los dos.",[11,552,553,556],{},[28,554,555],{},"Semana 4 — Migración de la base."," Réplica lógica de Postgres del RDS al destino. Cutover en una ventana de mantenimiento corta — suele ser minutos, no horas, con replicación lógica funcionando. Aplicación apunta a la base nueva. RDS queda como hot standby por una semana.",[11,558,559,562],{},[28,560,561],{},"Semana 5 — Migración de aplicaciones web."," Apps que corren en EC2 se vuelven jobs en el orquestador. Router integrado hace el papel del ALB. DNS apunta al orquestador (o a CloudFlare al frente). Cutover gradual usando weighted DNS.",[11,564,565,568],{},[28,566,567],{},"Semana 6 — Colas y jobs asíncronos."," SQS sale, Redis Streams o RabbitMQ entra. Workers corren en el orquestador. Período de dual-consume para garantizar que ningún mensaje cae.",[11,570,571,574],{},[28,572,573],{},"Semana 7 — Lambdas y workloads event-driven."," La semana más variable. Lambdas HTTP migran rápidamente. Lambdas event-driven exigen el redesign discutido arriba. Si tienes más de diez Lambdas complejas, considera extender a dos semanas.",[11,576,577,580],{},[28,578,579],{},"Semana 8 — Cutover final, monitoreo intensivo, decommission."," CloudFlare al frente sustituye CloudFront. Route 53 se vuelve CloudFlare DNS. CloudWatch va a Prometheus + Loki. Última cosa: apaga las EC2 antiguas y cierra la cuenta AWS — o deja un saldo mínimo si aún mantienes algún servicio residual.",[15,582,584],{"id":583},"los-cinco-lock-ins-que-mas-duelen-en-la-migracion","Los cinco lock-ins que más duelen en la migración",[11,586,587],{},"La honestidad es importante: no todo migra fácil. Cinco cosas exigen trabajo extra y a veces cambian la viabilidad del proyecto:",[56,589,590,596,602,608,614],{},[59,591,592,595],{},[28,593,594],{},"DynamoDB con features específicas."," GSI, Streams, scan limits, TTL. No hay equivalente directo. El camino realista es rediseñar a Postgres con JSONB, o a un NoSQL auto-hospedado (FoundationDB, ScyllaDB) — re-arquitectura, no migración.",[59,597,598,601],{},[28,599,600],{},"Aurora-only features."," Aurora Serverless v2 con auto-scaling de connections, Aurora Global Database, Aurora I\u002FO optimized. Postgres auto-hospedado hace casi todo, pero no tiene el auto-scaling instantáneo. Para workloads spiky, considera Neon (que ofrece patrón similar).",[59,603,604,607],{},[28,605,606],{},"IAM cross-service complejo."," Equipos que usan IAM roles cross-account, Service Control Policies y organización jerárquica de cuentas tienen control de acceso embebido en la arquitectura. Migrar exige reimplementar la jerarquía en otro lugar — Vault, CloudFlare Access, o inyección de secretos del orquestador. Cuenta días, no horas.",[59,609,610,613],{},[28,611,612],{},"Lambda + EventBridge complejo."," Pipelines de eventos con varios hops, retries, dead letter queues. No migra como está. Rediseña en torno de colas (RabbitMQ, NATS) y workers persistentes. Generalmente el sistema queda más simple — pero toma tiempo.",[59,615,616,619],{},[28,617,618],{},"S3 events disparando Lambda."," Patrón muy común, y R2 con CloudFlare Workers cubre la mayoría de los casos. Para workloads que necesitan garantía exactamente-una-vez o ordering fuerte, cambia a patrón de cola — productor escribe evento en la cola cuando archivo es confirmado, worker consume.",[15,621,623],{"id":622},"la-cuenta-de-ahorro-sin-optimismo","La cuenta de ahorro, sin optimismo",[11,625,626],{},"Escenario típico de SaaS con cinco aplicaciones:",[11,628,629],{},[28,630,631],{},"Antes en AWS:",[633,634,635,638,641,644,647,650,653,656,659,662,665],"ul",{},[59,636,637],{},"Cinco EC2 t3.medium: US$150",[59,639,640],{},"RDS db.t4g.large Multi-AZ: US$280",[59,642,643],{},"ElastiCache cache.t4g.micro: US$15",[59,645,646],{},"S3 con 100GB y egreso medio: US$60",[59,648,649],{},"ALB: US$22",[59,651,652],{},"CloudFront con volumen medio: US$80",[59,654,655],{},"Route 53 + SES: US$15",[59,657,658],{},"CloudWatch logs\u002Fmétricas: US$50",[59,660,661],{},"Lambda con volumen medio: US$40",[59,663,664],{},"NAT Gateway: US$40",[59,666,667],{},[28,668,669],{},"Total: US$752\u002Fmes = US$9.024\u002Faño",[11,671,672],{},[28,673,674],{},"Después auto-hospedado:",[633,676,677,680,683,686,689,692,695,698,701],{},[59,678,679],{},"Cuatro VPS Hetzner CPX21 con orquestador: US$36",[59,681,682],{},"Postgres auto-hospedado (incluido en las VPS): US$0",[59,684,685],{},"Valkey (incluido): US$0",[59,687,688],{},"CloudFlare R2 50GB con egreso ilimitado: US$15",[59,690,691],{},"CloudFlare CDN + DNS: US$0",[59,693,694],{},"Resend para email: US$20",[59,696,697],{},"Prometheus + Loki (incluido): US$0",[59,699,700],{},"Workers de cola (incluidos): US$0",[59,702,703],{},[28,704,705],{},"Total: US$71\u002Fmes = US$852\u002Faño",[11,707,708],{},"Ahorro: US$681\u002Fmes, US$8.172\u002Faño. Aproximadamente un mes de salario de ingeniero sénior.",[11,710,711],{},"La migración consume ochenta a ciento sesenta horas. En tiempo de dev sénior interno, son entre tres y seis mil dólares. Retorno en cinco a diez meses, con ahorro perpetuo después.",[15,713,715],{"id":714},"la-migracion-mas-no-obvia-secretos-y-credenciales","La migración más no-obvia: secretos y credenciales",[11,717,718],{},"Vale repetir, porque es lo que más sorprende a equipos experimentados en AWS. En AWS accedes a S3 sin credentials en el código — IAM role del EC2 resuelve. Accedes a RDS vía IAM authentication. Accedes a parameter store vía IAM. El equipo pierde la noción de que esa \"magia\" existe.",[11,720,721],{},"Fuera de AWS, toda credencial es explícita. Aplicación necesita:",[633,723,724,727,730,733,736],{},[59,725,726],{},"Access key y secret para R2 (creada en el panel CloudFlare)",[59,728,729],{},"Connection string con user y contraseña para el Postgres",[59,731,732],{},"URL del Valkey con contraseña",[59,734,735],{},"API key para Resend",[59,737,738],{},"Token para CloudFlare API si automatizas DNS",[11,740,741],{},"La solución del orquestador es declarar todo eso como secretos inyectados en el contenedor como variables de entorno. El secreto es cifrado en reposo en el orquestador y nunca aparece en los logs. Para rotación automática y auditoría sofisticada, Vault auto-hospedado entra en juego — pero la mayoría de los equipos no lo necesita.",[11,743,744],{},"Plan: haz una hoja de cálculo con todas las credenciales que cada app necesita, crea cada una en el proveedor de destino, declara como secreto en el orquestador, inyecta en el contenedor. Cuatro a ocho horas para un stack medio.",[15,746,748],{"id":747},"cuando-no-migrar-perfiles-honestos","Cuándo NO migrar (perfiles honestos)",[11,750,751],{},"Cuatro situaciones en que salir de AWS es decisión equivocada:",[11,753,754,757],{},[28,755,756],{},"Cumplimiento que lista AWS nominalmente."," FedRAMP, ITAR, ciertos contratos de gobierno americano y algunas certificaciones financieras exigen que la infra corra sobre componentes pre-aprobados — y la mayoría de las listas incluyen AWS, GCP, Azure, y pocos proveedores adicionales. Si tu cliente es una agencia federal americana, AWS resuelve una rebanada del cumplimiento que costaría meses replicar en otro lugar.",[11,759,760,763],{},[28,761,762],{},"Equipo único enfocado en producto."," Si eres el único dev y estás construyendo el producto, ocho semanas redirigidas a la migración matan roadmap. Hazlo cuando tengas el segundo dev, o cuando los costes AWS pasen a representar rebanada significativa del MRR. Antes de eso, AWS es caro pero comprable.",[11,765,766,769],{},[28,767,768],{},"Costes AWS por debajo del 2% del MRR."," Cuenta de doscientos dólares mensuales para startup que factura veinte mil. El ahorro es real pero el esfuerzo no vale el foco. Migra cuando la factura pase del cinco al diez por ciento del MRR — ahí la ganancia cubre la oportunidad perdida.",[11,771,772,775],{},[28,773,774],{},"Lock-in profundo en DynamoDB o Aurora Serverless v2."," Ya tratado arriba. Si la mitad de tu arquitectura es DynamoDB con Streams, no migras — re-arquitectas. Ese es proyecto diferente, con alcance diferente, decisión diferente.",[15,777,779],{"id":778},"estrategia-hibrida-alternativa-para-quien-no-quiere-migrar-todo","Estrategia híbrida — alternativa para quien no quiere migrar todo",[11,781,782],{},"Equipos con cincuenta o más aplicaciones en AWS raramente migran en bloque. La estrategia híbrida funciona mejor:",[633,784,785,788,791,794],{},[59,786,787],{},"Mantiene en AWS lo que es caro de mover (Aurora con features específicas, Lambda crítica, DynamoDB)",[59,789,790],{},"Mueve lo que es barato de mover y caro de mantener (S3 → R2, CloudFront → CloudFlare, EC2 no-críticas → VPS)",[59,792,793],{},"Establece VPN o conexión privada entre los dos extremos",[59,795,796],{},"Ahorro parcial pero cero riesgo de migración radical",[11,798,799],{},"Resultado típico: corte del cuarenta al sesenta por ciento de la factura AWS, sin tocar las piezas críticas. Para empresa que paga diez mil mensuales, eso es cuatro a seis mil de vuelta — y el resto migra orgánicamente en los doce meses siguientes, conforme equipos reescriben componentes por otras razones.",[15,801,803],{"id":802},"heroctl-como-destino-lo-que-cambia-en-la-practica","HeroCtl como destino — lo que cambia en la práctica",[11,805,806],{},"HeroCtl es orquestador de contenedores que corre en cualquier servidor Linux con Docker. Cuatro VPS corriendo HeroCtl entregan experiencia operacional cercana a la que tendrías con ECS gestionado — sin cobro gestionado, sin lock-in.",[11,808,809],{},"Lo que sustituye:",[633,811,812,817,823,829],{},[59,813,814,816],{},[28,815,239],{}," se vuelve el router integrado de HeroCtl, con TLS Let's Encrypt automático",[59,818,819,822],{},[28,820,821],{},"CloudWatch parcial"," se vuelve métricas embebidas y logs centralizados nativos",[59,824,825,828],{},[28,826,827],{},"RDS automated backups"," se vuelve backup gestionado en el Business Edition",[59,830,831,834],{},[28,832,833],{},"IAM roles en apps"," se vuelve inyección de secretos en el manifiesto de job",[11,836,837],{},"Lo que sigue igual: Docker corriendo tu app exactamente como corre en ECS. Variables de entorno, healthchecks, rolling deploys, multi-replicas. La aplicación no percibe la diferencia.",[11,839,840,841,844,845,848,849,852],{},"Hay tres planes. ",[28,842,843],{},"Community"," es gratuito permanente, sin límite de servidores o jobs — corre toda la stack descrita arriba incluyendo alta disponibilidad real, router, certificados, métricas y logs. ",[28,846,847],{},"Business"," añade SSO, RBAC granular, auditoría detallada, backup gestionado y soporte con SLA — útil para quien ya tiene requisitos formales de plataforma. ",[28,850,851],{},"Enterprise"," añade escrow de código fuente, soporte 24×7 y desarrollo dedicado. Los precios de Business y Enterprise están publicados en la página de planes, sin \"habla con ventas\" obligatorio.",[11,854,855],{},"El cluster público de demostración corre en cuatro servidores y la elección de coordinador ocurre en cerca de siete segundos cuando el nodo actual cae — número medido, no estimado.",[11,857,34],{},[15,859,861],{"id":860},"preguntas-que-recibimos-sobre-salida-de-aws","Preguntas que recibimos sobre salida de AWS",[358,863,865],{"id":864},"cuanto-tiempo-realmente-toma-migrar-un-stack-medio","¿Cuánto tiempo realmente toma migrar un stack medio?",[11,867,868],{},"Para startup con cinco a diez aplicaciones, sin lock-ins profundos: seis a ocho semanas con un dev sénior dedicando medio tiempo, o tres a cuatro semanas con dedicación total. Stacks mayores o con Lambdas event-driven complejas: tres a cuatro meses. Stacks con DynamoDB o Aurora Serverless v2 críticos: vuélvelo proyecto de re-arquitectura, plazo de seis meses o más.",[358,870,872],{"id":871},"dynamodb-tiene-alternativa-buena","¿DynamoDB tiene alternativa buena?",[11,874,875],{},"No hay sustituto idéntico. Las opciones honestas son: Postgres con JSONB para la mayoría de los casos (resuelve ochenta por ciento de los usos de DynamoDB con performance excelente), ScyllaDB o Cassandra auto-hospedado para workloads que realmente necesitan NoSQL distribuido, FoundationDB para quien necesita transacciones distribuidas. Ninguno de esos es \"cambia la connection string y listo\" — exigen cambio en el modelo de datos.",[358,877,879],{"id":878},"puedo-mantener-aws-para-la-base-y-mover-compute","¿Puedo mantener AWS para la base y mover compute?",[11,881,882],{},"Sí, y es la estrategia híbrida más común. Aurora o RDS sigue en AWS, EC2 se vuelven VPS Hetzner o DigitalOcean, S3 se vuelve R2. Abres VPN entre los dos extremos y el app sigue accediendo RDS vía endpoint privado. Ahorro típicamente del cincuenta al setenta por ciento de la factura AWS.",[358,884,886],{"id":885},"s3-r2-cuanto-cuesta-transferir-1tb","S3 → R2: ¿cuánto cuesta transferir 1TB?",[11,888,889,890,892],{},"R2 cobra cero de ingreso. AWS cobra la salida de S3 — aproximadamente nueve centavos de dólar por GB en los primeros 10 TB. Un terabyte cuesta cerca de noventa dólares para salir de AWS. Tiempo de transferencia: doce a veinticuatro horas con ",[376,891,549],{}," paralelizado, dependiendo de la banda. Tras la migración, US$15 mensuales almacenando 50GB con egreso ilimitado, contra US$120 por lo mismo en S3 con tráfico activo.",[358,894,896],{"id":895},"lambda-como-migrar-event-driven","Lambda — ¿cómo migrar event-driven?",[11,898,899,900,903,904,907,908,911,912,915],{},"Depende del disparador. ",[28,901,902],{},"S3 disparando Lambda"," se vuelve R2 con CloudFlare Workers (mismo patrón, sin cambio radical). ",[28,905,906],{},"SQS disparando Lambda"," se vuelve worker persistente en el app server, consumiendo de la cola — generalmente código más simple que la Lambda original. ",[28,909,910],{},"EventBridge agendado"," se vuelve cron en el orquestador. ",[28,913,914],{},"EventBridge con reglas complejas y Step Functions encadenados"," exige redesign — dibuja el flujo en torno a una cola central con workers consumidores, queda más auditable.",[358,917,919],{"id":918},"rds-multi-az-postgres-auto-hospedado-es-confiable","RDS Multi-AZ → Postgres auto-hospedado, ¿es confiable?",[11,921,922],{},"Postgres con replicación física streaming y failover vía Patroni alcanza confiabilidad cercana a la del RDS Multi-AZ — siempre que el equipo sepa operar. Si nadie en el equipo domina Postgres en producción, el camino más seguro es Neon o Supabase, que entregan Postgres gestionado con tier gratuito. Para equipos con SRE o DBA, auto-hospedado es viable y ahorra substancial. Para equipos sin esa competencia, el ahorro no compensa el riesgo — paga por el gestionado.",[358,924,926],{"id":925},"email-ses-quien-es-mas-barato","Email SES — ¿quién es más barato?",[11,928,929],{},"Depende del volumen. Hasta 10 mil emails mensuales, Postmark a US$15 entrega mucho más (entregabilidad superior, dashboard mejor, soporte responsivo). Entre 50 mil y 100 mil mensuales, Resend a US$20 es el mejor coste-beneficio. Por encima de 500 mil mensuales, Mailgun o Amazon SES compiten en precio — y SES quizás tiene sentido mantener incluso después de migrar el resto. Email es de los pocos servicios AWS que puede ser racional mantener.",[358,931,933],{"id":932},"dns-todo-cloudflare-o-mezclar","DNS — ¿todo CloudFlare o mezclar?",[11,935,936],{},"CloudFlare resuelve DNS, CDN, DDoS, WAF y workers en el plan gratis. Para la mayoría de los stacks, concentrar todo ahí simplifica operación y corta coste. La excepción es cumplimiento que exige separación geográfica de proveedor — algunos frameworks de gobernanza piden que DNS y CDN sean de proveedores distintos. En ese caso, CloudFlare DNS + Bunny CDN (o Fastly) cumple la separación.",[358,938,940],{"id":939},"cumplimiento-lgpd-cambia-algo","¿Cumplimiento LGPD cambia algo?",[11,942,943],{},"LGPD no exige hospedaje en territorio brasileño. Exige que sepas dónde están los datos y que tengas contrato adecuado con el operador. Hetzner (Alemania), DigitalOcean (varias regiones), CloudFlare R2 (multi-región) y Magalu Cloud (Brasil) son todos compatibles con LGPD desde que el contrato esté en orden. Para quien prefiere dato en territorio nacional por preferencia de cliente, Magalu Cloud es la alternativa directa.",[11,945,34],{},[15,947,949],{"id":948},"proximo-paso-concreto","Próximo paso concreto",[11,951,952],{},"Si llegaste hasta aquí, el próximo paso es la hoja de cálculo. Lista los doce servicios, marca cuáles tu stack usa, anota coste actual de cada uno, elige alternativa. En una tarde sabes si la migración vale el esfuerzo.",[11,954,955],{},"Cuando estés listo para provisionar el destino:",[957,958,963],"pre",{"className":959,"code":960,"language":961,"meta":962,"style":962},"language-bash shiki shiki-themes github-dark-default","curl -sSL get.heroctl.com\u002Finstall.sh | sh\n","bash","",[376,964,965],{"__ignoreMap":962},[966,967,970,974,978,982,986],"span",{"class":968,"line":969},"line",1,[966,971,973],{"class":972},"sQhOw","curl",[966,975,977],{"class":976},"sFSAA"," -sSL",[966,979,981],{"class":980},"s9uIt"," get.heroctl.com\u002Finstall.sh",[966,983,985],{"class":984},"suJrU"," |",[966,987,988],{"class":972}," sh\n",[11,990,991],{},"Corre en cualquier servidor Linux con Docker. Los primeros tres se vuelven quórum para el plano de control replicado. Envías jobs vía CLI, API o panel web embebido. El cluster decide dónde correr, hace health check, gestiona rolling deploys, emite certificados Let's Encrypt automáticamente.",[11,993,994,995,1000,1001,1005],{},"Para contexto adicional sobre costes y arquitectura, lee también ",[996,997,999],"a",{"href":998},"\u002Fes\u002Fblog\u002Faws-ecs-vs-kubernetes-vs-auto-hospedado","AWS ECS vs Kubernetes vs auto-hospedado"," y ",[996,1002,1004],{"href":1003},"\u002Fes\u002Fblog\u002Fcuanto-cuesta-alojar-un-saas-2026","Cuánto cuesta alojar un SaaS en 2026",".",[11,1007,1008],{},"La migración es más aburrida que difícil. Lo difícil es decidir empezar.",[1010,1011,1012],"style",{},"html pre.shiki code .sQhOw, html code.shiki .sQhOw{--shiki-default:#FFA657}html pre.shiki code .sFSAA, html code.shiki .sFSAA{--shiki-default:#79C0FF}html pre.shiki code .s9uIt, html code.shiki .s9uIt{--shiki-default:#A5D6FF}html pre.shiki code .suJrU, html code.shiki .suJrU{--shiki-default:#FF7B72}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":962,"searchDepth":1014,"depth":1014,"links":1015},2,[1016,1017,1018,1019,1034,1035,1036,1037,1038,1039,1040,1041,1052],{"id":17,"depth":1014,"text":18},{"id":37,"depth":1014,"text":38},{"id":50,"depth":1014,"text":51},{"id":136,"depth":1014,"text":137,"children":1020},[1021,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033],{"id":360,"depth":1022,"text":361},3,{"id":370,"depth":1022,"text":371},{"id":394,"depth":1022,"text":395},{"id":404,"depth":1022,"text":405},{"id":421,"depth":1022,"text":422},{"id":431,"depth":1022,"text":432},{"id":441,"depth":1022,"text":442},{"id":448,"depth":1022,"text":449},{"id":458,"depth":1022,"text":459},{"id":471,"depth":1022,"text":472},{"id":492,"depth":1022,"text":493},{"id":502,"depth":1022,"text":503},{"id":524,"depth":1014,"text":525},{"id":583,"depth":1014,"text":584},{"id":622,"depth":1014,"text":623},{"id":714,"depth":1014,"text":715},{"id":747,"depth":1014,"text":748},{"id":778,"depth":1014,"text":779},{"id":802,"depth":1014,"text":803},{"id":860,"depth":1014,"text":861,"children":1042},[1043,1044,1045,1046,1047,1048,1049,1050,1051],{"id":864,"depth":1022,"text":865},{"id":871,"depth":1022,"text":872},{"id":878,"depth":1022,"text":879},{"id":885,"depth":1022,"text":886},{"id":895,"depth":1022,"text":896},{"id":918,"depth":1022,"text":919},{"id":925,"depth":1022,"text":926},{"id":932,"depth":1022,"text":933},{"id":939,"depth":1022,"text":940},{"id":948,"depth":1014,"text":949},"case-study",null,"2026-05-26","Migrar de AWS a cloud más barato (Hetzner\u002FDO) o auto-hospedado parece proyecto de 1 año. En la práctica, se puede hacer en 6-8 semanas si mapeas los 12 servicios AWS-only que tu stack usa de verdad.",false,"md",{},true,"\u002Fes\u002Fblog\u002Fsalir-de-aws-sin-reescribir-el-stack","16 min",{"title":5,"description":1056},{"loc":1061},"es\u002Fblog\u002Fsalir-de-aws-sin-reescribir-el-stack",[1067,1068,1069,1070,1071],"aws","migracion","costo","salida","guia","7t3Io1_05IyDD4uz6Hub49VPeOsK60ryeoLqblj3EKc",[1074,1081],{"title":1075,"path":1076,"stem":1077,"description":1078,"date":1079,"category":1080,"children":-1},"Rolling deploy seguro: por qué el tuyo puede no serlo","\u002Fes\u002Fblog\u002Frolling-deploy-seguro-por-que-el-tuyo-puede-no-serlo","es\u002Fblog\u002Frolling-deploy-seguro-por-que-el-tuyo-puede-no-serlo","Cambiar contenedor sin downtime parece simple — pull nueva imagen, mata viejo, sube nuevo. Funciona hasta el primer viernes a las 17h. Los 6 detalles que separan rolling deploy real de teatro.","2025-12-04","engineering",{"title":1082,"path":1083,"stem":1084,"description":1085,"date":1086,"category":1080,"children":-1},"Sentry auto-hospedado vs SaaS: cuánto se ahorra realmente","\u002Fes\u002Fblog\u002Fsentry-auto-hospedado-vs-saas-cuanto-se-ahorra","es\u002Fblog\u002Fsentry-auto-hospedado-vs-saas-cuanto-se-ahorra","Sentry SaaS empieza en US$26\u002Fmes, escalando rápido con volumen. Auto-hospedado es 'gratuito' — pero corre Postgres + Redis + Kafka + ClickHouse. Análisis honesto de cuándo vale auto-hospedar.","2026-05-05",1777362204249]