VPNSmith
cloud-privacyINFO

Migración AWS → Contabo: guía de cost optimization 2026

Procedimiento paso a paso para migrar un stack EC2 + RDS + S3 a Contabo VPS + Postgres self-hosted + almacenamiento compatible S3. ROI medido: 78% de ahorro en 12 meses.

Por Eric Gerard · Fondateur · VPNSmith — Spécialiste self-host VPN & VPS GDPR10 min de lecturaFoto: Luke Chesser — Unsplash

Tu factura de AWS de fin de mes te hace rechinar los dientes. 187 €/mes por un stack Node.js + Postgres 50 GB + 200 GB de objetos estáticos, del cual el 60 % se va en RDS y NAT Gateway. Sabes que existe algo más barato, pero dudas en abandonar la comodidad de EC2 y la magia de S3. Esta guía es el feedback honesto de una migración que hicimos en interno en abril de 2026: paso de AWS a un único VPS Contabo a 9,99 €/mes, 78 % de ahorro en 12 meses, sin pérdida funcional significativa para nuestro caso de uso.

Por qué dejar AWS en 2026

Tres razones acumulativas, no una:

  • Coste. AWS escala brutalmente con el tráfico saliente (0,09 $/GB por encima de 100 GB), los NAT Gateways (45 $/mes solo por existir) y los snapshots de RDS. Un proyecto que arranca a 30 $/mes termina con frecuencia en 200-400 $/mes en 18 meses sin añadir una sola feature.
  • GDPR y soberanía. Incluso en eu-central-1 (Frankfurt), AWS es una entidad estadounidense sometida al CLOUD Act: un juez federal de EE. UU. puede exigir acceso a datos almacenados en Europa. Para datos de clientes UE es un riesgo jurídico real, formalizado por las recomendaciones EDPB de 2020 (post-Schrems II).
  • Lock-in técnico. IAM, KMS, VPC, ALB, Lambda — cada servicio de AWS te ata un poco más. A los dos años, "solo mudarse" lleva tres semanas. Cuanto más esperas, más pagas, y más caro se vuelve irse.

Contabo no es magia: es un proveedor alemán de VPS de gama baja que te entrega una máquina Ubuntu y te deja hacer el resto. Pero para el 80 % de las cargas SaaS de pymes y autónomos, es más que suficiente — y entre 5 y 10× más barato.

Casos donde la migración merece la pena (y donde no)

Sé honesto contigo mismo. La migración AWS → Contabo tiene sentido si:

  • Tienes uno o dos servicios que hospedar (API + DB + objetos), no una arquitectura de 30 microservicios.
  • Tu tráfico es predecible (sin picos 100× sobre la baseline). Contabo no tiene auto-scaling.
  • Aceptas convertirte en admin: apt, systemctl, ufw, backups manuales.
  • Tus datos no toleran el CLOUD Act, o tu factura AWS supera los 100 €/mes.

Al contrario, quédate en AWS si:

  • Usas intensivamente Lambda, Cognito, SageMaker, SQS gestionado. Coste de migración > coste de AWS.
  • Tienes un SLA contractual de cliente que exige 99,99 % (Contabo es 99,9 %, ~8 h de downtime/año).
  • Manejas decenas de TB y tu tráfico saliente supera la cuota Contabo (32 TB/mes).

Nuestro caso en VPNSmith: un único backend Node.js + Postgres + objetos estáticos. Todos los "sí" marcados. Decisión tomada en una hora.

Auditar el coste actual de AWS (método Cost Explorer)

Antes de migrar, mide. Sin baseline, no hay ROI.

  1. Ve a AWS Cost Explorer → ReportsCost & Usage Reports.
  2. Filtra los últimos 3 meses, granularidad mensual, agrupado por Service.
  3. Exporta a CSV. Abre en una hoja de cálculo. Obtienes típicamente:
Servicio AWSCoste mensual medio
EC2 (1× t3.medium)32 €
RDS (db.t3.small Postgres)38 €
S3 (200 GB + requests)12 €
Data Transfer Out24 €
NAT Gateway41 €
CloudFront18 €
Route 53 + otros6 €
Total171 € / mes

Anualizado: 2.052 €. Atención al detalle: en este perfil, NAT Gateway + Data Transfer = 65 €/mes, es decir el 38 % de la factura solo por mover bytes. Es el punto ciego clásico.

Provisionar el VPS Contabo objetivo

Para este stack, escogemos un Cloud VPS 10 de Contabo: 6 vCPU, 16 GB RAM, 400 GB NVMe, 1 Gbps, 32 TB de tráfico/mes. Tarifa 9,99 €/mes en compromiso 24 meses.

Aprovisionamiento:

# Una vez recibido el VPS (email Contabo con IP + root password)
ssh root@TU_IP

# Hardening mínimo
adduser ericg
usermod -aG sudo ericg
mkdir -p /home/ericg/.ssh
nano /home/ericg/.ssh/authorized_keys   # pega tu clave SSH
chmod 700 /home/ericg/.ssh && chmod 600 /home/ericg/.ssh/authorized_keys
chown -R ericg:ericg /home/ericg/.ssh

sed -i 's/^PermitRootLogin .*/PermitRootLogin no/' /etc/ssh/sshd_config
sed -i 's/^#PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config
systemctl restart ssh

apt update && apt upgrade -y
apt install -y ufw fail2ban
ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw --force enable
systemctl enable --now fail2ban

El detalle completo del hardening (Lynis, snapshots Contabo, journald) está en la guía WireGuard self-host. Aquí aplicamos las mismas bases.

Migración Postgres RDS → Postgres self-hosted (pg_dump paso a paso)

Es la pieza más crítica. Procedimiento probado:

Paso 1 — Instalar Postgres 15 en Contabo

sudo apt install -y postgresql-15 postgresql-contrib-15
sudo systemctl enable --now postgresql

# Crear el usuario app y la DB
sudo -u postgres psql <<EOF
CREATE USER appuser WITH PASSWORD 'PEGA_UNA_PWD_FUERTE';
CREATE DATABASE appdb OWNER appuser;
GRANT ALL PRIVILEGES ON DATABASE appdb TO appuser;
EOF

Activa SSL y autoriza las conexiones remotas solo desde tu app (o solo en local si Postgres corre en la misma máquina que la API — recomendado):

sudo nano /etc/postgresql/15/main/postgresql.conf
# ssl = on
# listen_addresses = 'localhost'  (o '*' si la app vive en otro VPS)

sudo nano /etc/postgresql/15/main/pg_hba.conf
# Añade: hostssl appdb appuser TU_IP_APP/32 scram-sha-256

sudo systemctl restart postgresql

Paso 2 — Dump desde RDS

Desde tu puesto, con acceso a RDS:

pg_dump \
  -h tu-rds.eu-central-1.rds.amazonaws.com \
  -U masteruser \
  -d appdb \
  -Fc \
  -f appdb.dump

# Formato custom (-Fc) = comprimido + paralelizable al restore

Para una base de 50 GB, cuenta 10-25 min según la clase RDS y el ancho de banda.

Paso 3 — Transferencia y restore

scp appdb.dump ericg@TU_IP_CONTABO:/tmp/
ssh ericg@TU_IP_CONTABO

sudo -u postgres pg_restore \
  -d appdb \
  -j 4 \
  --no-owner \
  --role=appuser \
  /tmp/appdb.dump

# Verificar
sudo -u postgres psql -d appdb -c "SELECT count(*) FROM users;"

Verifica la integridad comparando los count(*) de las tablas grandes entre RDS y Contabo. Diferencia = 0.

Paso 4 — Backup automático post-migración

Reemplazas los automated backups de RDS por un cron simple:

sudo nano /usr/local/bin/pg-backup.sh
#!/bin/bash
DATE=$(date +%Y%m%d-%H%M)
sudo -u postgres pg_dump -Fc appdb > /var/backups/postgres/appdb-$DATE.dump
find /var/backups/postgres -name "appdb-*.dump" -mtime +14 -delete
# Push hacia MinIO o un S3 externo para off-site
rclone copy /var/backups/postgres/appdb-$DATE.dump remote:backups/postgres/

Cron diario a las 3 a. m.: 0 3 * * * /usr/local/bin/pg-backup.sh.

Migración S3 → MinIO (rclone, compatibilidad aws-cli)

MinIO es un servidor de almacenamiento de objetos 100 % compatible con la API S3, open source, en Go. Instalación directa:

wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
sudo mv minio /usr/local/bin/

sudo mkdir -p /data/minio
sudo useradd -r minio-user -s /sbin/nologin
sudo chown minio-user:minio-user /data/minio

sudo nano /etc/default/minio
MINIO_VOLUMES="/data/minio"
MINIO_OPTS="--console-address :9001 --address :9000"
MINIO_ROOT_USER=admin
MINIO_ROOT_PASSWORD=PEGA_UNA_PWD_FUERTE_DE_32_CHARS

Servicio systemd: usa el .service oficial (docs MinIO) y systemctl enable --now minio.

Migración de los objetos desde S3 con rclone:

sudo apt install -y rclone

rclone config
# n) New remote → name: aws / s3 / AWS / pega access_key + secret_key
# n) New remote → name: minio / s3 / Other / endpoint http://localhost:9000 / pega admin + pwd

# Bucket-to-bucket
rclone copy aws:mi-bucket-prod minio:mi-bucket-prod --transfers=8 --progress

Para 200 GB: cuenta 2-5 horas según el ancho de banda saliente de AWS (que te costará ~18 € de transfer-out final, es el coste de salida).

En el código de la aplicación, ningún cambio: tu SDK aws-sdk-js sigue funcionando, solo apuntas al endpoint MinIO:

const s3 = new S3Client({
  endpoint: 'https://storage.tudominio.com',
  region: 'us-east-1',           // valor arbitrario requerido
  credentials: { accessKeyId, secretAccessKey },
  forcePathStyle: true,          // importante para MinIO
});

Cambio de DNS sin downtime

El método limpio, planificado en 10 días:

  • D-10: desplegar el stack completo en Contabo, smoke-test interno via override de /etc/hosts.
  • D-7: reducir el TTL de los registros A en Route 53 de 3600 → 60 segundos. Dejar propagar 48 h.
  • D-3: freeze de features, último pg_dump incremental, último rclone sync de objetos.
  • D-1: cambio en hora valle (típicamente 3 a. m. UTC para público UE). Modificar el registro A: vieja IP AWS → nueva IP Contabo. Propagación máx. 60 s.
  • D+0 → D+2: monitoring agresivo (latencia, errores 5xx, métricas de DB). Mantener AWS encendido "por si acaso".
  • D+7: cleanup AWS (terminate EC2, delete RDS tras snapshot final exportado, delete bucket S3 tras backup off-site).

Cero downtime perceptible para el usuario si Postgres está sync (un freeze de 5 min en solo-lectura basta para mover el delta final).

¿Quieres un VPS Contabo para arrancar la migración? Cloud VPS 10 Contabo, compromiso 24 meses — 9,99 €/mes

ROI medido (tabla de coste antes/después en 12 meses)

Nuestra migración interna, medida:

ConceptoAWS (antes)Contabo (después)
Compute (EC2 t3.medium / VPS Cloud 10)32 €9,99 €
Base de datos (RDS / Postgres self)38 €0 € (incluido)
Almacenamiento de objetos (S3 200 GB / MinIO)12 €0 € (incluido)
Data transfer out24 €0 € (32 TB/mes incluido)
NAT Gateway41 €0 € (no necesario)
CloudFront CDN18 €12 € (BunnyCDN externo)
DNS Route 536 €0,40 € (Cloudflare gratis + 1 dominio)
Backup off-site (Wasabi 50 GB)0 €3 €
Monitoring (UptimeRobot pro)0 €4 €
Total mensual171 €29,39 €
Coste anual2.052 €352,68 €

Ahorro: 1.699,32 €/año, es decir 83 %. En nuestro caso real algo más cargado (187 €/mes AWS), es un ahorro del 78 %, o sea 1.752 €/año. El payback es instantáneo: sin coste significativo de migración (un día de trabajo).

Lo que se pierde frente a AWS (managed services)

Sin marketing, seamos claros con las pérdidas:

  • RDS Multi-AZ auto-failover: en AWS, si la primary cae, la secondary toma el relevo en 60-120 s. Self-hosted en Contabo, hace falta un segundo VPS + streaming replication + Patroni. Es factible, pero añade tiempo de ops.
  • S3 11 nines de durabilidad: Amazon garantiza 99,999999999 % de durabilidad por objeto (replicación interna en 3 AZ). MinIO en 1 disco = la durabilidad de tu disco NVMe. Solución: backups regulares hacia Wasabi o Backblaze B2 (2-6 €/mes por 200 GB off-site).
  • IAM granular: reemplazado por usuarios Linux + sudoers + policies MinIO. Menos fino, más fácil de gestionar.
  • CloudWatch unificado: reemplazar por Prometheus + Grafana, o Netdata (15 min de setup), o un SaaS externo (Better Stack, Sentry).
  • Soporte enterprise 24/7: Contabo responde por email en 24-48 h. Para producción crítica, prevé un runbook + un segundo admin de guardia.

Cuenta 3 a 5 horas de ops al mes en régimen de crucero: updates de Ubuntu, comprobación de backups, alertas de monitoring. Es el verdadero coste oculto — nada insuperable, pero real.

Para ir más lejos

Artículo publicado el 2026-06-02. ROI medido en la migración interna de VPNSmith de abril de 2026. Divulgación de afiliación: si contratas un VPS Contabo desde los enlaces de este artículo, recibimos una comisión que financia las pruebas continuas de nuestras guías. El precio que pagas es idéntico. Solo recomendamos lo que usamos en producción.

★ Datacenter Nuremberg GDPR · ✓ IPv4 dédiée incluse · 200+ Mbps garantis

Probar Contabo30 jours satisfait ou remboursé