VPNSmith
cloud-privacyINFO

Migration AWS → Contabo : guide cost optimization 2026

Procédure pas-à-pas pour migrer une stack EC2 + RDS + S3 vers Contabo VPS + Postgres self-hosted + S3-compatible. ROI mesuré : 78% d'économie sur 12 mois.

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

Ta facture AWS de fin de mois te fait grincer des dents. 187 €/mois pour une stack Node.js + Postgres 50 Go + 200 Go d'objets statiques, dont 60 % part en RDS et NAT Gateway. Tu sais qu'il existe moins cher, mais tu hésites à abandonner le confort d'EC2 et la magie de S3. Ce guide est le retour d'expérience honnête d'une migration qu'on a faite en interne en avril 2026 : passage d'AWS à un seul VPS Contabo à 9,99 €/mois, 78 % d'économie sur 12 mois, sans perte de fonctionnalité significative pour notre cas d'usage.

Pourquoi quitter AWS en 2026

Trois raisons cumulatives, pas une seule :

  • Coût. L'addition AWS scale brutalement avec le trafic sortant (0,09 $/Go au-delà de 100 Go), les NAT Gateways (45 $/mois rien que pour exister) et les snapshots RDS. Un projet qui démarre à 30 $/mois finit fréquemment à 200-400 $/mois en 18 mois sans changement de feature.
  • GDPR & souveraineté. Même en région eu-central-1 (Frankfurt), AWS est une entité américaine soumise au CLOUD Act : un juge fédéral US peut exiger l'accès à des données stockées en Europe. Pour des données clients UE, c'est un risque juridique réel, formalisé par les recommandations EDPB de 2020 (post-Schrems II).
  • Verrouillage technique. IAM, KMS, VPC, ALB, Lambda — chaque service AWS te lie un peu plus. Au bout de 2 ans, "juste déménager" prend 3 semaines. Plus tu attends, plus tu paies, et plus c'est coûteux de partir.

Contabo n'est pas magique : c'est un fournisseur allemand de VPS bas de gamme qui te livre une machine Ubuntu et te laisse faire le reste. Mais pour 80 % des workloads SaaS de PME / solopreneurs, c'est largement suffisant — et 5 à 10× moins cher.

Cas d'usage où la migration vaut le coup (et où elle ne vaut pas)

Sois honnête avec toi-même. La migration AWS → Contabo a du sens si :

  • Tu as un ou deux services à héberger (API + DB + objets), pas une architecture micro-services à 30 conteneurs.
  • Ton trafic est prévisible (pas de pic 100× la baseline). Contabo n'a pas d'auto-scaling.
  • Tu acceptes de devenir admin : apt, systemctl, ufw, backups manuels.
  • Tes données ne tolèrent pas le CLOUD Act, ou ta facture AWS dépasse 100 €/mois.

À l'inverse, reste sur AWS si :

  • Tu utilises lourdement Lambda, Cognito, SageMaker, SQS managé. Le coût migration > coût AWS.
  • Tu as un SLA contractuel client qui exige 99,99 % (Contabo c'est 99,9 %, soit ~8h de downtime/an).
  • Tu manipules des dizaines de To et ton trafic sortant dépasse le quota Contabo (32 To/mois).

Notre cas chez VPNSmith : un seul backend Node.js + Postgres + objets statiques. Cocher tous les "oui". Décision prise en 1 heure.

Audit coût AWS actuel (méthode Cost Explorer)

Avant de migrer, mesure. Sans baseline, pas de ROI.

  1. Va dans AWS Cost Explorer → ReportsCost & Usage Reports.
  2. Filtre sur les 3 derniers mois, granularité mensuelle, regroupé par Service.
  3. Exporte en CSV. Ouvre dans un tableur. Tu obtiens typiquement :
Service AWSCoût mensuel moyen
EC2 (t3.medium x1)32 €
RDS (db.t3.small Postgres)38 €
S3 (200 Go + requests)12 €
Data Transfer Out24 €
NAT Gateway41 €
CloudFront18 €
Route 53 + autres6 €
Total171 € / mois

Sur 12 mois : 2 052 €. Note bien le détail : sur ce profil, NAT Gateway + Data Transfer = 65 €/mois, soit 38 % de la facture juste pour faire entrer/sortir des octets. C'est l'angle mort classique.

Setup VPS Contabo cible

Pour cette stack, on prend un Cloud VPS 10 Contabo : 6 vCPU, 16 Go RAM, 400 Go NVMe, 1 Gbps, 32 To trafic/mois. Tarif 9,99 €/mois en engagement 24 mois.

Provisioning :

# Une fois le VPS reçu (email Contabo avec IP + root password)
ssh root@TON_IP

# Hardening minimal
adduser ericg
usermod -aG sudo ericg
mkdir -p /home/ericg/.ssh
nano /home/ericg/.ssh/authorized_keys   # coller la clé 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

Le détail complet du durcissement (Lynis, snapshots Contabo, journald) est dans le guide WireGuard self-host. On reprend les mêmes bases ici.

Migration Postgres RDS → Postgres self-hosted (pg_dump pas-à-pas)

C'est la pièce la plus critique. Procédure éprouvée :

Étape 1 — Installer Postgres 15 sur Contabo

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

# Créer l'utilisateur app et la DB
sudo -u postgres psql <<EOF
CREATE USER appuser WITH PASSWORD 'COLLE_UN_MDP_FORT';
CREATE DATABASE appdb OWNER appuser;
GRANT ALL PRIVILEGES ON DATABASE appdb TO appuser;
EOF

Active SSL et autorise les connexions distantes uniquement depuis ton app (ou en local si Postgres tourne sur la même machine que l'API — recommandé) :

sudo nano /etc/postgresql/15/main/postgresql.conf
# ssl = on
# listen_addresses = 'localhost'  (ou '*' si app sur autre VPS)

sudo nano /etc/postgresql/15/main/pg_hba.conf
# Ajouter : hostssl appdb appuser TON_IP_APP/32 scram-sha-256

sudo systemctl restart postgresql

Étape 2 — Dump depuis RDS

Depuis ton poste, avec accès RDS :

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

# Format custom (-Fc) = compressé + parallélisable au restore

Pour une base de 50 Go, compter 10-25 min selon la classe RDS et la bande passante.

Étape 3 — Transfert et restore

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

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

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

Vérifie l'intégrité en comparant les count(*) des grosses tables entre RDS et Contabo. Différence = 0.

Étape 4 — Backup automatique post-migration

Tu remplaces RDS automated backups par 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 vers MinIO ou S3 externe pour off-site
rclone copy /var/backups/postgres/appdb-$DATE.dump remote:backups/postgres/

Cron quotidien à 3h du matin : 0 3 * * * /usr/local/bin/pg-backup.sh.

Migration S3 → MinIO (rclone, compatibilité aws-cli)

MinIO est un serveur de stockage objet 100 % compatible API S3, open source, Go. Installation directe :

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=COLLE_UN_MDP_FORT_DE_32_CHARS

Service systemd : récupère le .service officiel (docs MinIO) et systemctl enable --now minio.

Migration des objets depuis S3 avec rclone :

sudo apt install -y rclone

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

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

Pour 200 Go : compter 2-5 heures selon bande passante AWS sortante (qui te coûtera ~18 € de transfer-out final, c'est le coût d'évasion).

Côté code applicatif, aucun changement : ton SDK aws-sdk-js continue de fonctionner, tu pointes juste sur l'endpoint MinIO :

const s3 = new S3Client({
  endpoint: 'https://storage.tondomaine.com',
  region: 'us-east-1',           // valeur arbitraire requise
  credentials: { accessKeyId, secretAccessKey },
  forcePathStyle: true,          // important pour MinIO
});

DNS bascule sans downtime

La méthode propre, planifiée sur 10 jours :

  • J-10 : déployer la stack complète sur Contabo, smoke-test interne via /etc/hosts override.
  • J-7 : réduire le TTL des records A dans Route 53 de 3600 → 60 secondes. Laisser propager 48h.
  • J-3 : freeze des features, dernier pg_dump incrémental, dernier rclone sync des objets.
  • J-1 : bascule en heure creuse (typiquement 3h du matin UTC pour un public EU). Modifier l'enregistrement A : ancien IP AWS → nouveau IP Contabo. Propagation max 60s.
  • J+0 → J+2 : monitoring agressif (latence, erreurs 5xx, métriques DB). Garder AWS allumé "au cas où".
  • J+7 : cleanup AWS (terminate EC2, delete RDS snapshot final exporté, delete bucket S3 après backup off-site).

Aucun downtime perceptible utilisateur si Postgres est sync (read-only freeze de 5 min suffit pour basculer le delta final).

Tu veux un VPS Contabo pour démarrer la migration ? Cloud VPS 10 Contabo, engagement 24 mois — 9,99 €/mois

ROI mesuré (tableau coût avant/après sur 12 mois)

Notre migration interne, mesurée :

PosteAWS (avant)Contabo (après)
Compute (EC2 t3.medium / VPS Cloud 10)32 €9,99 €
Base de données (RDS / Postgres self)38 €0 € (inclus)
Stockage objet (S3 200 Go / MinIO)12 €0 € (inclus)
Data transfer out24 €0 € (32 To/mois inclus)
NAT Gateway41 €0 € (non nécessaire)
CloudFront CDN18 €12 € (BunnyCDN externe)
DNS Route 536 €0,40 € (Cloudflare gratuit + 1 domaine)
Backup off-site (Wasabi 50 Go)0 €3 €
Monitoring (UptimeRobot pro)0 €4 €
Total mensuel171 €29,39 €
Coût annuel2 052 €352,68 €

Économie : 1 699,32 € / an, soit 83 %. Sur notre cas réel un peu plus chargé (187 €/mois AWS), c'est 78 % d'économie, soit 1 752 €/an. Le payback est instantané : pas de coût de migration significatif (1 journée de travail).

Ce qu'on perd vs AWS (managed services)

Pas de marketing, soyons clairs sur les pertes :

  • RDS auto-failover Multi-AZ : sur AWS, si la primary tombe, la secondary prend la main en 60-120s. Sur Contabo en self-host, il faut un second VPS + streaming replication + Patroni. C'est faisable mais ça ajoute du temps ops.
  • S3 11 nines de durabilité : Amazon garantit 99,999999999 % de durabilité par objet (réplication interne 3 AZ). MinIO sur 1 disque = la durabilité de ton disque NVMe. Solution : backups réguliers vers Wasabi ou Backblaze B2 (2-6 €/mois pour 200 Go off-site).
  • IAM granulaire : remplacé par utilisateurs Linux + sudoers + MinIO policies. Moins fin, plus simple à gérer.
  • CloudWatch unifié : à remplacer par Prometheus + Grafana ou Netdata (15 min de setup) ou un SaaS externe (Better Stack, Sentry).
  • Support 24/7 entreprise : Contabo répond email sous 24-48h. Pour du critique, prévois un runbook + un second admin de garde.

Compter 3 à 5 heures d'ops par mois en régime de croisière : MAJ Ubuntu, vérif backups, monitoring alerts. C'est le vrai coût caché — pas insurmontable, mais réel.

Pour aller plus loin

Article publié le 2026-06-02. ROI mesuré sur la migration interne VPNSmith d'avril 2026. Divulgation affiliée : si tu prends un VPS Contabo via les liens de cet article, on touche une commission qui finance le test continu de nos guides. Le tarif que tu paies est identique. On ne recommande que ce qu'on utilise en production.

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

Voir l'offre Contabo30 jours satisfait ou remboursé