Serial 'Radin' pour ton EC2 connecté à RDS !! 🚀

03 Juin 2025, 09:11 CEST

Devops AWS EC2 and RDS Setup

Créer une application full-stack complète sur AWS avec un budget maîtrisé

Bienvenue dans notre série sur l’optimisation des coûts AWS ! Dans l’article précédent, nous avons mis en place une base de données MySQL RDS optimisée via Terraform. Aujourd’hui, on passe à la vitesse supérieure : connecter une vraie application à cette infrastructure. À la fin, tu auras une application full-stack prête pour la production, reposant sur les bonnes pratiques AWS… et sans faire exploser ton budget.

🎯 Ce que tu vas construire

Un déploiement sécurisé, scalable et optimisé, avec :

✅ Une application Web Full-Stack ( version minimalistes )

  • Frontend HTML/CSS/JavaScript réactif
  • Backend Node.js avec API REST et gestion des erreurs
  • Gestion de tâches en temps réel (ajouter, compléter, supprimer)

✅ Une infrastructure Cloud AWS

  • RDS MySQL (Multi-AZ, chiffrée, db.t4g.micro économe)
  • EC2 (t2.micro) hébergeant l’application
  • VPC avec sous-réseau public et groupes de sécurité
  • Entièrement pilotée via Terraform

✅ Des bonnes pratiques de production

  • Configuration via fichiers .env
  • Supervision des processus avec PM2
  • Versioning avec Git
  • Accès sécurisé en SSH et à la base de données
  • Infrastructure minimale mais robuste

✅ Une vraie optimisation des coûts

  • EC2 dans la Free Tier
  • RDS à consommation réduite
  • Aucun NAT Gateway (zéro frais inutiles)
  • Support Multi-AZ intégré

Étape 1 : Forquer l'application 🍴

AWS Full-Stack Setup Overview

On commence avec un fork de la todo app de yogasaikrishna.

Pourquoi forker plutôt que cloner ?

  • Pour avoir le contrôle sur le code
  • Ajouter facilement un support de configuration .env
  • Suivre les changements liés à l’intégration AWS
  • Et éventuellement contribuer à l’original 😉

👉 Fork réalisé vers : <Ton dépôt GitHub>
👉 Branche créée : feat-addEnv

Étape 2 : Mise en place de l’infra avec Terraform 🏗️

Forking the Todo App

On ajoute une instance EC2 dans le main.tf :


# Instance EC2
resource "aws_instance" "app server" {
  ami                    = data.aws_ami.amazon_linux.id
  instance_type          = var.ec2_instance_type
  key_name               = var.key_pair_name
  subnet_id              = module.vpc.public_subnet_ids[0]
  vpc_security_group_ids = [aws_security_group.ec2.id]

  user_data = base64encode(templatefile("${path.module}/user_data.sh", {
    rds_endpoint = module.rds_mysql.db_instance_endpoint,
    db_username  = var.username,
    db_password  = var.password
  }))

  tags = {
    Name = "${var.identifier}-app-server"
  }
}
                

Et on définit un groupe de sécurité :


resource "aws_security_group" "ec2" {
  name_prefix = "${var.identifier}-ec2-"
  vpc_id      = module.vpc.vpc_id

  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  ingress {
    from_port   = 8000
    to_port     = 8000
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }

  tags = {
    Name = "${var.identifier}-ec2-sg"
  }
}
                

Pour consulter le changement complet du code, vous pouvez retrouver le commit ici :

Puis, une fois le code Terraform correctement ajouté, exécutez terraform plan et terraform apply pour déployer l'EC2.

Terraform EC2 Setup

Vous pouvez également accéder au tableau de bord EC2 pour vérifier votre instance récemment créée avec Terraform. Vous y trouverez les détails importants tels que les métadonnées et l’adresse IPv4 publique. Ces informations seront indispensables une fois votre application TODO lancée et accessible sur EC2.

Terraform EC2 Setup

Voici une autre astuce pour vérifier si votre RDS est bien connecté à votre instance EC2 : rendez-vous dans le groupe de règles de sécurité (Security Group) de votre RDS, puis consultez la section des règles entrantes (Inbound rules) où figure le CIDR/IP autorisé. Vérifiez que le nom et l’ID du Security Group correspondent bien à ceux du Security Group de votre instance EC2. Si c’est le cas, félicitations : vous avez correctement configuré la connexion entre votre instance EC2 et votre RDS via Terraform. (Voir capture d’écran ci-dessous.)

Terraform EC2 Setup

Étape 3 : Gestion des clés SSH 🔑

Terraform EC2 Setup

Dès que l'EC2 est déployé, vous pouvez aller sur le tableau de bord EC2, puis créer une clé.

Environment Configuration

Crée et utilise une nouvelle clé SSH pour connecté au serveur EC2:


chmod 600 ~/.ssh/<nom-de-ta-cle>.pem
ssh -i ~/.ssh/<nom-de-ta-cle>.pem ec2-user@<Adresse-IP-Publique-EC2>
                

Astuce : Sauvegarde bien ta clé privée, AWS ne pourra pas te la redonner.

Étape 4 : Configuration du serveur EC2 🛠️

SSH Key Configuration

Installer Node.js et PM2 sur Amazon Linux 2 :


# Installer NVM + Node.js
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
. ~/.nvm/nvm.sh
nvm install 16

# Installer PM2
npm install -g pm2
                

✅ Node : v16.20.2
✅ PM2 : installé globalement

Tester la connexion RDS


mysql -h <Endpoint-RDS> -u <Utilisateur-DB> -p

CREATE DATABASE todos;
USE todos;
CREATE TABLE todo_list (
  id INT AUTO_INCREMENT PRIMARY KEY,
  task VARCHAR(255) NOT NULL,
  status BOOLEAN DEFAULT FALSE
);
                

Vous pouvez aussi tout simplement lancer le script Bash directement depuis le terminal de votre EC2. Voici un exemple de code disponible sur GitHub : user_data.sh

Une fois l'application TODO correctement installée et la première table todo créée, vous pouvez déjà aller dans AWS RDS puis dans CloudWatch pour consulter les logs. Vérifiez notamment les connexions à la base de données (DatabaseConnections) afin de vous assurer que tout fonctionne correctement. Voir la capture d’écran ci-dessous.

Environment Configuration

Étape 6 :lancer avec PM2 🎨

pm2

Et lance avec PM2 :


NODE_ENV=production pm2 start app.js --name "todoapp"
pm2 list
pm2 logs todoapp
pm2 save
pm2 startup
                

Une fois le serveur application lancé, vous verrez dans les logs le démarrage de l’application Todo. Ensuite, rendez-vous sur l’adresse publique de votre instance EC2 en ajoutant le port :8000 à l’URL. Vous pourrez ainsi accéder à votre application en fonctionnement.

Ajouter le frontend

Bonus : ENI, c’est quoi ce truc ? 🌐

Les interfaces réseau élastiques (ENI) jouent un rôle clé en liant les instances RDS et EC2 au sein de votre VPC. Lorsqu’une instance RDS est créée via Infrastructure as Code (IaC), AWS génère automatiquement une ENI associée à cette instance. Cette ENI agit comme un point d’attache réseau virtuel, permettant la communication sécurisée entre les services AWS et votre instance RDS. Elle garantit que le trafic réseau entre votre EC2 et la base de données passe par un canal dédié et isolé dans votre infrastructure cloud. Sans cette interface réseau, la connexion entre vos ressources AWS ne serait pas possible ou sécurisée.

ENI
Type d’ENI Zone de dispo Rôle
ENI primaire eu-west-1a Endpoint principal RDS
ENI de secours eu-west-1b Basculer en Multi-AZ

Cette Resource Map révèle l'infrastructure VPC qui accueille nos ENI RDS. Les deux subnets dans des Availability Zones distinctes (us-east-1a et us-east-1b) expliquent pourquoi AWS crée automatiquement deux ENI : une pour l'instance RDS principale et une pour le standby Multi-AZ. Les route tables orchestrent le routage du trafic vers ces interfaces réseau virtuelles.

VPC

Groupes de sécurité : Ingress vs Egress

Terme Direction Métaphore
Ingress Entrée Quelqu’un frappe à ta porte
Egress Sortie Tu sors de chez toi

Exemple :


resource "aws_security_group" "app" {
  ingress {
    from_port   = 8000
    to_port     = 8000
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  egress {
    from_port   = 443
    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
}
                

💰 Optimisation des coûts

Ressources

Ressource Type Coût estimé
EC2 t2.micro ~0 € (Free Tier)
RDS db.t4g.micro ~12 €/mois

Économies

  • Pas de NAT Gateway (économie de ~45 €/mois)
  • Multi-AZ sans coût caché
  • CloudWatch inclus

Total (année 1) : ~12 €/mois

Après Free Tier : ~20–25 €/mois

🎉 Démo finale

  • API REST
  • Connexion sécurisée à RDS
  • Process géré automatiquement
  • Infra 100 % Terraform

Test API en ligne de commande :


curl http://<Adresse-IP-Publique-EC2>:8000/todo/
curl -X POST -H "Content-Type: application/json" \
  -d '{"task":"Apprendre AWS","status":false}' \
  http://<Adresse-IP-Publique-EC2>:8000/todo/
                

📚 À retenir

Infra as Code

  • 100 % reproductible avec terraform apply
  • Versionnée avec Git
  • Configurations spécifiques à l’environnement

Bonnes pratiques

  • Groupes de sécurité minimalistes
  • VPC isolé et bien cloisonné
  • Supervision via CloudWatch
  • PM2 pour la résilience

Attention : même après toutes les optimisations décrites dans cette série, il reste toujours des leviers supplémentaires à activer en fonction de votre projet, de la taille de votre code-base et du trafic attendu.

  • Si votre dépôt dépasse 100 Go, réduisez encore la bande passante : stockez une archive ZIP de l’application sur Amazon S3, puis décompressez-la lors du déploiement. Vous éliminez ainsi les git clone répétitifs et quasiment tous les coûts de transfert.
  • Pour une industrialisation complète, adoptez Ansible : un playbook peut installer automatiquement les dépendances (MySQL, Node.js, npm, etc.), centraliser la configuration et rendre le processus réutilisable pour vos prochains projets.

Références