đ AWS RDS (Relational Database Service)
Guide complet IDEO-Lab : BDD Managées (Postgres, MySQL), HA, Monitoring, Backups & Intégration Django.
Concept : Service Managé (PaaS)
RDS n'est pas une VM. C'est une BDD "as a service". (Patching, Backups, HA gérés).
PaaS ManagedConcept : Moteurs (Engines)
PostgreSQL, MySQL, MariaDB, SQL Server, Oracle. (Et Aurora).
PostgreSQL MySQLConcept : Instance Types
Le "Hardware" (db.t3.micro, db.r6g.large...). (T=Burstable, R=RAM, M=General).
Création 1 : Moteur & Version
Choix (ex: PostgreSQL 15.3), Template (Prod/Dev), Nom Master.
Create DB Master UserCréation 2 : Réseau (VPC)
(Crucial) VPC, DB Subnet Group (Multi-AZ), Public Access (Non !).
VPC Subnet GroupCréation 3 : Security Group (SG)
(PiÚge n°1) Le "Pare-feu". (Autoriser Port 5432 depuis le SG de l'App).
Security Group FirewallHA : Multi-AZ (Standby)
(Disponibilité) Réplication Synchrone (Standby) pour Failover (panne).
Multi-AZ HA SynchroneScaling : Read Replicas
(Performance) Réplication Asynchrone (lecture seule) pour décharger le Master.
Read Replica Scaling AsynchroneStockage : EBS (gp3/io1)
Disque (gp3, io1). Storage Autoscaling (augmente si disque plein).
gp3 IOPSMonitoring 1 : CloudWatch
(Base) Métriques (CPU, RAM, IOPS, Conexions, Disk Free). (1-min).
CloudWatch CPUUtilizationMonitoring 2 : Enhanced (OS)
(Détaillé) Métriques OS (Agent). (Load, Process list, RAM active/free). (1-sec).
Enhanced Monitoring OS MetricsMonitoring 3 : Performance Insights
(SQL) Le "Top" des requĂȘtes SQL. (Load AAS, Wait Events).
Performance Insights AAS SQL TuningBackup : Snapshots (Auto/Manual)
Snapshots (EBS) automatiques (nuit) ou manuels (gardés si BDD supprimée).
Snapshot BackupRestore : Point-in-Time (PITR)
(Crucial) Restaurer (Ă la seconde prĂšs) (ex: 14:32:05) (Snapshot + Logs TX).
PITR Transaction LogsGestion : Maintenance Window
FenĂȘtre (30min/semaine) pour les patchs OS/Moteur (gĂ©rĂ©s par AWS).
Maintenance PatchingSécu : IAM DB Authentication
(Moderne) Connexion (Postgres/MySQL) via IAM (Token) sans mot de passe.
IAM Auth No PasswordSécu : Chiffrement (KMS)
Chiffrement (At-Rest) via une clé KMS (Audit, ContrÎle).
Encryption KMSInteg : Django (settings.py)
(Best Practice) Utiliser Secrets Manager (Boto3) (pas de password hardcodé).
Django Secrets ManagerAvancé : RDS Proxy
(Serverless) Connection Pooling managĂ©. (Ăvite l'Epuisement de connexions).
RDS Proxy Connection PoolingAvancé : Aurora Serverless v2
(Cloud Native) Scale (CPU/RAM) à la volée (de 0.5 à 128 RCU) (MySQL/Postgres).
Aurora Serverless v2Avancé : RDS Custom
AccĂšs (SSH/SSM) Ă l'OS (EC2) sous-jacent (pour patchs custom Oracle/SQL).
RDS Custom SSH AccessLiens URL vers AWS RDS
Liens Officiels & Documentation AWS RDS.
RDS URL AWS DOCMonitoring Spécifique : PostgreSQL sur RDS
Au-delĂ du CPU/RAM (CloudWatch), le monitoring de PostgreSQL.
RDS Monitoring RDS TuningTarification RDS (FinOps)
La tarification RDS est multi-dimensionnelle.
RDS Pricing RDS Billing11.1. ModĂšle Pricing RDS (Les 5 Piliers)
La facture RDS (Standard, non-Aurora) est une addition de (principalement) 5 composants :
| Pilier | Unité | Description |
|---|---|---|
| 1. Instance (Compute) | $/Heure | Le coût du "Serveur" (CPU/RAM) (ex: db.r6g.large).(Si Multi-AZ (4.1) : Vous payez x2 Instances (Master + Standby)). |
| 2. Stockage (Storage) | $/GB/Mois | L'espace disque (Volume EBS) provisionnĂ© (ex: 100 GB gp3).(Vous payez pour 100GB, mĂȘme si vous n'en utilisez que 10GB). |
| 3. I/O (IOPS) | $/Million I/Os (ou $/IOPS/Mois) | (Gratuit (inclus) pour gp3 (jusqu'Ă 3000 IOPS)).(Payant si vous utilisez io1/io2 (Provisioned IOPS)).(Payant (toujours) pour Aurora (11.2)). |
| 4. Backup (Stockage) | $/GB/Mois | Le stockage (sur S3) des Backups (Snapshots + Logs PITR). (Le stockage (Backup) équivalent à 100% de votre BDD (Stockage Pilier 2) est GRATUIT). (Ex: BDD 100GB. 150GB Backups. Vous payez (uniquement) les 50GB (excédent)). |
| 5. Data Transfer (RĂ©seau) | $/GB | (Trafic Sortant (Egress) vers Internet (ex: $0.09/GB)).(Trafic Inter-AZ (ex: $0.01/GB)) (ex: EC2 (AZ-A) -> RDS-Master (AZ-B)).(Trafic Entrant (Ingress) = Gratuit). (Trafic Interne (MĂȘme AZ) = Gratuit). |
11.2. Comparaison Coût/Performance : RDS vs Aurora
Les modÚles de facturation sont fondamentalement différents, surtout sur le Stockage/I/O.
| Composant | RDS Standard (ex: Postgres) | Amazon Aurora (ex: Postgres) |
|---|---|---|
| Instance (Compute) | $/Heure (ex: db.r6g.large).(Coût x2 si Multi-AZ). | $/Heure (ex: db.r6g.large).(Les Read Replicas (HA/Scaling) sont (aussi) facturés $/Heure). |
| Stockage | Provisionné (Fixe) ($/GB/Mois).(Ex: Vous payez 100GB (gp3)). | Auto-Scalé (Pay-per-use) ($/GB/Mois).(Ex: Vous payez uniquement les 12GB (utilisés)). (Plus cher au $/GB que gp3). |
| I/O (IOPS) | Inclus (Gratuit) (avec gp3, jusqu'à 3000 IOPS).(Payant uniquement si io1/io2 (Provisionné)). | Toujours Payant ($/Million I/Os).(Toutes les I/O (Read/Write) vers la couche stockage (partagée) sont facturées). |
Analyse (Coût / Performance)
- Workload (Faible I/O) (ex: Blog, App Dev/Test) :
RDS (gp3)(Standard) est (généralement) moins cher (car les I/O sont "gratuits" (inclus)).
- Workload (Haut I/O - Ăcriture) (ex: API (Prod), OLTP) :
- (RDS) Vous auriez besoin de
RDS (io2)(ex: 30 000 IOPS ProvisionnĂ©s) = ExtrĂȘmement cher. - (Aurora) Vous payez (uniquement) les I/O (
$/Million) que vous consommez (Pay-per-use). - (Résultat) :
Aurora(PaaS) est (souvent) moins cher (et plus performant) queRDS (io2)(IaaS) (pour les hautes performances).
- (RDS) Vous auriez besoin de
11.3. Politiques de Réduction des Coûts (Opérationnel)
1. ArrĂȘter les Instances (Dev/Test)
(Action) : ArrĂȘter (StopDBInstance) les instances (Dev/Test/Staging) non-utilisĂ©es (ex: la nuit, le weekend).
- (Automatisation) : (via Script Lambda + EventBridge Scheduler (Cron)).
- (Ăconomie) : Vous stoppez la facturation du Pilier 1 (Instance $/Heure) (le plus cher).
- (Attention) : Vous continuez (toujours) de payer le Pilier 2 (Stockage $/GB/Mois) (le disque (EBS) persiste).
2. Choisir le Bon Stockage (gp3 vs io1/io2)
(Action) : Ne jamais provisionner (sur-provisionner) io1/io2 (cher) "au cas oĂč".
- (Bonne Pratique) : Démarrer (toujours) avec
gp3(Standard). - (Monitorer) : Surveiller (CloudWatch (7.1))
Read/WriteLatencyetDiskQueueDepth. - (Si (et seulement si)
gp3(scalé au max (16k IOPS)) est (toujours) le goulot) -> Migrer versio2.
3. Ajuster la Rétention des Backups
(Action) : Modifier la "Backup Retention Period" (Rétention des Backups Automatiques (PITR) (4.5)).
- (Prod) : Garder 7, 14, ou 35 jours (requis pour PITR).
- (Dev/Test) : Réduire la Rétention (ex:
1 jour). (Réduit les coûts du Pilier 4 (Stockage Backup)). - (Si
0 jour(désactivé) -> Vous perdez le PITR (4.5) (et (MySQL) cassez les Read Replicas (4.3))).
4. "Right-Sizing" (Ajuster la Taille)
(Action) : Utiliser (CloudWatch (7.1) / Performance Insights (7.3)) pour analyser l'utilisation (CPUUtilization, FreeableMemory) sur 30 jours.
- (Sur-provisionné) : Si le
CPU (Avg)est à 5% (sur 1 mois) sur unedb.r6g.xlarge-> (Action) Scaler (Down) (Verticalement) versdb.r6g.large(50% moins cher). - (Scaling Lecture (8.2)) : (PlutÎt que de Scaler (Up) le Master (cher)) -> (Action) Ajouter une Read Replica (moins chÚre) pour décharger les
SELECT(BI).
11.4. Reserved Instances (RI) & Savings Plans (SP)
Ce sont les modĂšles d'engagement (1 an ou 3 ans) pour les workloads (charges) stables (Production) (qui tournent 24/7).
(Gain) : Offre une réduction significative (ex: -40% à -60%) (sur le Pilier 1 (Instance $/Heure)) (par rapport au prix On-Demand (9.1)).
RDS Reserved Instances (RI) (ModĂšle "Legacy")
- Engagement (Rigide) : Vous réservez (ex:) 1x
db.r6g.large(Famille) +PostgreSQL(Moteur) +eu-west-3(Région) +Multi-AZ(Déploiement) ... (pendant 3 ans). - (Avantage) : Offre (parfois) la réduction maximale.
- (Inconvénient) : Zéro flexibilité. (Si (aprÚs 1 an) vous migrez de
Postgres->Aurora, ouParis->Francfort, vous perdez la réduction (vous payez la RI "à vide")).
Savings Plans (SP) (ModĂšle Moderne)
(Recommandé) Plus flexible. Vous ne réservez pas une "instance", vous vous engagez (pendant 1/3 ans) sur un montant ($) (ex: "Je m'engage à dépenser $5.00 / heure en Compute").
- Compute Savings Plan : (Flexibilité Totale) S'applique (automatiquement) à EC2 (n'importe quelle famille/région), Fargate, ET Lambda.
- EC2 Instance Savings Plan : (Similaire RI) (Rigide) S'applique (uniquement) à 1 Famille/Région (ex:
db.r6gĂeu-west-3) (en Ă©change d'une rĂ©duction (lĂ©gĂšrement) supĂ©rieure).
11.5. Aurora Serverless v2 (Pay-per-use)
C'est le modÚle de facturation (spécifique à Aurora (3.3)) conçu pour les workloads (charges) variables, imprévisibles, ou intermittents.
Facturation (Pay-per-use)
Vous n'ĂȘtes pas facturĂ© ($/Heure) pour une "Instance" (ex: .large). Vous ĂȘtes facturĂ© ($/ACU-Heure) (Ă la seconde) pour la CapacitĂ© (ACU) (CPU/RAM) que vous consommez (utilisez) rĂ©ellement.
Cas d'Usage (Optimisation Coût)
(Scénario) : Instance Dev/Test (utilisée 8h/jour (Semaine), 0h/jour (Weekend)).
(RDS Standard db.r6g.large Provisionné 24/7) :
- CoĂ»t (730h/mois) : ~ $73.58 / mois (PayĂ© 24/7, mĂȘme si idle).
(Aurora Serverless v2 (Min 0.5 ACU)) :
- (Usage Actif) : 8h/j * 22j/mois * (ex: 4 ACU (Avg)) = 704 ACU-Heures
- (Idle / Nuit/WE) : 550h/mois * 0.5 ACU (Min) = 275 ACU-Heures
- (Stockage/IO (Aurora)) : ... (Coût similaire/supérieur)
- (Résultat) : Le coût "Compute" (Instance) est (drastiquement) plus bas (car il "scale down" (presque) à zéro (0.5 ACU) quand inutilisé).
(Anti-Pattern) : N'utilisez pas Serverless v2 (PPU) pour une BDD (Prod) qui tourne (en baseline) à 80% CPU 24/7. (Une instance Provisionnée (Standard) + Reserved Instance (RI) (11.4) sera (beaucoup) moins chÚre).
10.1. DMS (AWS Database Migration Service)
DMS est un service (PaaS) de rĂ©plication (pas de "magie" de schĂ©ma) pour migrer des bases de donnĂ©es (On-Premise, EC2, ou mĂȘme RDS) vers AWS (ou l'inverse), avec un temps d'arrĂȘt (downtime) quasi-nul.
(Composants) : Source Endpoint (Origine) -> Replication Instance (EC2 managée) -> Target Endpoint (Destination).
Migration HomogĂšne (MĂȘme Moteur)
Exemple : MySQL (On-Premise) -> RDS (MySQL).
- (Full Load) : DMS copie (Snapshot) les données initiales.
- (CDC - Change Data Capture) : (Zéro Downtime) DMS se connecte aux Logs de Transaction (
Binlog) (Source) et rĂ©plique (en temps rĂ©el) tous lesINSERT/UPDATE/DELETE(qui ont lieu sur On-Prem) vers la Cible (RDS). - (Cutover / Bascule) : (Weekend) 1. ArrĂȘter l'App (On-Prem). 2. Attendre que DMS (CDC) soit Ă "Lag 0". 3. Basculer (DNS/Config) l'App vers RDS (Cloud). 4. ArrĂȘter DMS.
Migration HétérogÚne (Moteurs Différents)
Exemple : Oracle (On-Premise) -> RDS (PostgreSQL). (Le "Graal" de la migration : sortir des licences chĂšres).
(PiĂšge) : DMS migre les DonnĂ©es (Data) (SELECT *, INSERT ...), mais PAS le SchĂ©ma (Schema) (PL/SQL (Oracle) â pl/pgsql (Postgres)).
Outil Requis : AWS SCT (Schema Conversion Tool)
C'est un outil (Desktop/Client Lourd) (à lancer avant DMS) pour la migration hétérogÚne :
- (SCT) 1. Analyse : SCT se connecte Ă Oracle (Source) et Postgres (Cible).
- (SCT) 2. Rapport (Analyse) : GénÚre un "Rapport de Migration" (ex: "90% (Automatique), 10% (Manuel)").
- (Auto) :
VARCHAR2(Oracle) ->VARCHAR(Postgres). (NUMBER->NUMERIC). - (Manuel) : "Cette Procédure Stockée (
SYS.UTL_...) (Oracle) n'a aucun Ă©quivalent (Postgres) et doit ĂȘtre rĂ©-Ă©crite (Ă la main) (enpl/pgsql)".
- (Auto) :
- (SCT) 3. Conversion : SCT applique le schéma (converti) (Tables, Vues...) sur la Cible (Postgres).
- (DMS) 4. Migration Données : (Maintenant que le schéma (vide) existe) -> DMS (Full Load + CDC) migre les données (uniquement) d'Oracle (Source) vers Postgres (Cible).
10.2. Import de Données (Bulk / Dump)
Méthodes (hors-DMS) pour l'import (initial) (Bulk Load) de données (ex: migration "offline" (avec downtime) ou initialisation d'un environnement de Dev).
1. Outils Natifs (pg_dump / mysqldump)
C'est la méthode "classique" (Client -> Serveur).
(PiĂšge) : Vous ne pouvez pas (SSH) vous connecter Ă l'hĂŽte RDS (1.1). Vous devez exĂ©cuter l'outil (pg_restore) (client) depuis une instance EC2 (Bastion/Admin) (dans le mĂȘme VPC) qui, elle, a accĂšs (RĂ©seau/SG) Ă l'Endpoint RDS.
Exemple (PostgreSQL - pg_restore) :
# (Sur l'EC2 "Bastion")
# 1. (On-Prem) Dump (Structure + Données)
$ pg_dump -U admin -h 192.168.1.10 -Fc -f backup.dump ma_bdd
# 2. (Bastion) Copier 'backup.dump' (ex: via S3) sur l'EC2
$ aws s3 cp s3://.../backup.dump .
# 3. (Bastion) Restaurer (Restore) vers l'Endpoint RDS
$ pg_restore -v -j 8 -U postgres_admin \
-h mon-db.cabcdef123.eu-west-3.rds.amazonaws.com \
-d ma_bdd_rds \
backup.dump
2. Import (Natif) depuis S3
Méthode (PaaS) beaucoup plus rapide (performante) (car "Server-Side") pour charger (en masse) des données (.csv, .txt) (stockées sur S3) directement dans RDS (sans passer par une EC2 "goulot").
(PostgreSQL) (Extension aws_s3) :
-- (Nécessite IAM Role (attaché à RDS) (pour 's3:GetObject'))
-- (Nécessite 'CREATE EXTENSION aws_s3;')
-- (SQL) Lancer l'import (depuis S3)
SELECT aws_s3.table_import_from_s3(
'ma_table_users',
'',
'(FORMAT CSV, HEADER)',
'mon-bucket-import',
'imports/users.csv',
'eu-west-3'
);
(MySQL / Aurora) (Commande LOAD DATA) :
-- (Nécessite IAM Role (attaché à RDS) (pour 's3:GetObject'))
LOAD DATA FROM S3 's3://mon-bucket-import/imports/users.csv'
INTO TABLE ma_table_users
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;
10.3. Migration (Upgrade) de RDS (Standard) vers Aurora
C'est le "chemin de migration" (recommandé par AWS) pour (facilement) convertir une instance RDS (Standard) (Postgres/MySQL) existante vers Amazon Aurora (plus performant (3.3), meilleur HA (4.4)).
Drop-in Compatible (Compatibilité)
Puisque Aurora (3.3) est 100% compatible (filaire) (wire-compatible) avec Postgres/MySQL, l'application (ex: Django) ne sait pas (et n'a pas besoin de savoir) qu'elle parle Ă Aurora (vs RDS Standard).
La migration (cÎté App) consiste (uniquement) à changer l'Endpoint (DNS) (HOST) (dans settings.py (5.4)) (du vieil Endpoint RDS vers le nouvel Endpoint Cluster Aurora).
Chemin de Migration (Facile - via "Read Replica")
Méthode (la plus simple) pour migrer (avec downtime minime) (ex: MySQL -> Aurora MySQL).
- (Jour 1) (Instance RDS (MySQL) (Master) tourne (en Prod)).
- (Jour 1) (Console RDS) Clic Droit (sur le Master RDS) -> "Create Aurora read replica".
- (AWS) (En arriĂšre-plan) :
- Crée un Nouveau Cluster Aurora (vide).
- Prend un Snapshot (interne) du Master (RDS).
- Charge (Restore) ce Snapshot dans le Cluster Aurora.
- Ătablit une RĂ©plication (
Binlog) (Asynchrone) (Source: RDS Master -> Cible: Aurora Cluster).
- (Jour 1 -> Jour 2) (Attente) Le Cluster Aurora (Replica) "rattrape" (catches up) le Master (RDS). (Surveiller
ReplicaLag(CloudWatch) -> 0). - (Jour 2 - 02:00 UTC) (FenĂȘtre de Downtime) :
- (1) ArrĂȘter l'Application (EC2/Lambda) (Stop Ăcritures).
- (2) (Attendre
ReplicaLag = 0). - (3) (Console RDS) Clic Droit (sur l'Aurora Replica) -> "Promote" (Promouvoir).
- (4) (Flux) AWS "casse" la réplication. L'Aurora Replica devient un Cluster Master (R/W) indépendant.
- (5) Changer le
settings.py(App) (pour viser le nouvel Endpoint (Cluster) Aurora). - (6) Démarrer l'Application.
- (Jour 2 - 02:05 UTC) (Downtime: 5 min) L'application tourne sur Aurora. (Vous pouvez (ensuite) supprimer l'ancien Master RDS).
9.1. Patching Automatique (Versions Majeures/Mineures)
Puisque RDS (1.1) est un service managé (PaaS), AWS est responsable d'appliquer les patchs de sécurité (OS) et les mises à jour (Moteur BDD).
FenĂȘtre de Maintenance (Maintenance Window)
C'est une plage horaire (obligatoire) (ex: 30 min) que vous définissez (ex: "Dimanche, 03:00-03:30 UTC") (période de faible trafic).
C'est pendant cette fenĂȘtre (et uniquement pendant) qu'AWS appliquera (automatiquement) les patchs (planifiĂ©s) qui nĂ©cessitent un downtime (RedĂ©marrage).
Versions Mineures (Minor) vs Majeures (Major)
| Type | Exemple | Activation (Auto) | Impact (Downtime) |
|---|---|---|---|
| Mineure (Minor) | Postgres 15.2 -> 15.3 | (Automatique) (Case "Auto minor version upgrade"). AWS applique (force) le patch (sĂ©curitĂ©/bugs) pendant la FenĂȘtre de Maintenance. | Downtime (minime) (Reboot). (Si Multi-AZ (4.1) : AWS patche le Standby -> Failover -> Patche l'ancien Master -> Downtime quasi-nul). |
| Majeure (Major) | Postgres 14.x -> 15.x | (Manuel) Jamais automatique (car risque "Breaking Changes"). Vous (Admin) devez (via Console/API) planifier (lancer) l'upgrade. | Downtime (Long) (5 min à plusieurs heures, selon la taille). (Multi-AZ ne réduit pas le downtime de l'upgrade majeur). |
9.2. Backups, Restore & Clonage
Point-In-Time Restore (PITR)
(La Sauvegarde la plus importante) (Activée via "Automated Backups"). Combine 1 Snapshot (quotidien) + Logs de Transaction (continus, 5 min).
Permet de restaurer (vers une NOUVELLE instance) la BDD Ă n'importe quelle seconde (ex: Mardi 14:32:05) (juste avant une erreur DELETE (14:32:10)). (voir 4.5)
Snapshot Copy (Cross-Region)
C'est l'action (manuelle ou automatisée (via AWS Backup)) de Copier un Snapshot (ex: snap-prod) de votre Région (ex: Paris (eu-west-3)) vers une autre Région (ex: Francfort (eu-central-1)).
(Cas d'Usage) : Disaster Recovery (DR). Si toute la Région "Paris" tombe (panne majeure), vous pouvez Restaurer (Restore) le Snapshot (copié) à "Francfort" (et redémarrer l'App là -bas).
(Chiffrement) : Lors de la "Copie", vous pouvez (re)chiffrer le Snapshot (ex: avec une Clé KMS (de la Région Francfort)).
Cloner un Cluster Aurora (Fast Clone)
C'est une fonctionnalitĂ© (spĂ©cifique Ă Aurora (3.3)) extrĂȘmement rapide (quelques minutes) (pour crĂ©er un environnement de Test/Dev).
(Flux) : "Cloner" le Cluster Prod (10 TB) -> Clone-Dev.
(Technologie) : Copy-on-Write (CoW). Aurora (grĂące Ă son stockage partagĂ© (4.4)) ne copie pas les 10 TB (ce qui prendrait des heures). Il crĂ©e (instantanĂ©ment) un "pointeur" (mĂ©tadonnĂ©e) (Clone-Dev) qui lit les (mĂȘmes) donnĂ©es que Prod. (Il ne "copie" (Ă©crit) que les blocs qui sont modifiĂ©s (UPDATE) par l'Ă©quipe Dev).
9.3. Automatisation DevOps (Infrastructure as Code - IaC)
(Bonne Pratique n°1) : Ne jamais créer (cliquer) une BDD (Prod) manuellement (via la Console). Toujours la définir (provisionner) via du Code (IaC) (pour la Reproductibilité, l'Audit (Git), et l'Automatisation).
| Outil (IaC) | Langage | Exemple (Définition RDS) |
|---|---|---|
| Terraform (HashiCorp) | HCL (Déclaratif) | resource "aws_db_instance" "default" { ... }(Le Standard (Multi-Cloud)). GÚre son "état" ( .tfstate) (généralement dans S3 + Lock DynamoDB). |
| CloudFormation (Cfn) | YAML / JSON | Type: AWS::RDS::DBInstance(Natif AWS). (TrÚs verbeux). Atomique (Rollback en cas d'échec). |
| AWS CDK (Cloud Dev Kit) | Python, TypeScript, Go... | rds.DatabaseInstance(self, "DB", ...)(Moderne AWS). Code (Python/TS) (orienté objet) qui "compile" (synthétise) en CloudFormation (YAML). (TrÚs puissant). |
Le PiĂšge (IaC) : Le "Master Password" (Secret)
(Anti-Pattern) : Ne jamais "hardcoder" (écrire en dur) le mot de passe (master_password = "Password123!") dans votre code Terraform/CDK (qui est dans Git).
(Bonne Pratique) :
- (IaC) 1. Créer (via IaC) un Secret (
aws_secretsmanager_secret) (vide) (ou (Terraform) générer (random_password) et stocker). - (IaC) 2. Créer l'Instance RDS (
aws_db_instance) en (passant) (rĂ©fĂ©rençant) l'ARN du Secret (manage_master_user_password=true,master_user_secret_arn=...). - (RĂ©sultat) : RDS (service) (via IAM) va gĂ©nĂ©rer (lui-mĂȘme) un mot de passe (complexe) et le stocker (automatiquement) (Ă©crire) dans Secrets Manager. (Le mot de passe n'apparaĂźt jamais (en clair) dans le
.tfstateou le code).
9.4. Intégration CI/CD (Migrations de Schéma)
L'IaC (9.3) gĂšre l'Infrastructure (Le "Serveur" RDS). La CI/CD (DevOps) gĂšre le Code Applicatif (Django/Rails).
(Le PiÚge) : Comment (automatiser) la Migration de Schéma (BDD) (ex: ALTER TABLE users ADD COLUMN phone_number VARCHAR(20);) lors d'un déploiement (Blue/Green) ?
Outils de Migration (Alembic, Flyway...)
Vous (Développeur) n'écrivez jamais de ALTER TABLE (SQL) "à la main" (en Prod). Vous utilisez un outil de migration (versionné) :
- Python (Django/Flask) : Alembic (SQLAlchemy) (ou
django manage.py migrate). - Java (Spring Boot) : Flyway (SQL) ou Liquibase (XML/SQL).
- Node.js (Sequelize) : Sequelize-CLI.
(Ces outils "versionnent" (v1.sql, v2.sql...) les changements (schéma) et gÚrent (via une table _migrations) "quels" changements ont (déjà ) été appliqués (ou non)).
Exemple (Pipeline CI/CD) (ex: GitHub Actions, CodePipeline)
(Push (Git) -> 'main')
|
(1. CI: Build & Test)
|
(2. Deploy: AWS CodeDeploy (Blue/Green))
|
v
(Phase "BeforeAllowTraffic" (Avant de basculer le trafic))
|
v
[ đ„ TĂąche (Lambda / CodeBuild / EC2) ]
(
- Se connecte Ă l'Endpoint RDS (Master)
- Exécute l'outil de migration :
- "flyway:migrate" (ou "alembic upgrade head")
)
|
(Phase "AllowTraffic" (Bascule))
|
v
(Trafic (ALB) -> (Nouvelle Flotte EC2 (v2)) (qui utilise le schéma (v2)))
Déploiements Blue/Green (RDS)
RDS (Postgres/MySQL/Aurora) (récemment) supporte (nativement) les Déploiements Blue/Green (similaires à CodeDeploy (10.4)) pour les mises à jour (Majeures/Mineures) (9.1) ou les changements de Schéma (riskys).
- (RDS) Crée un "Clone" (Green) (Standby logique) de votre BDD (Blue) (via Réplication).
- (Vous) Appliquez (testez) vos migrations (DDL) (ex:
ALTER TABLE) (riskys) uniquement sur Green (Blue (Prod) tourne toujours). - (Vous) (Si OK) Clic "Switchover" -> RDS (bascule le DNS) (
Prod -> Green) (Downtime < 1 min).
8.1. Scalabilité Verticale (Scale-Up)
C'est l'action de rendre l'instance BDD (unique) plus "grosse" (plus puissante). C'est la premiÚre réponse à un goulot d'étranglement (CPU (6.1) ou RAM (6.3)).
1. Augmentation Instance (CPU/RAM)
Action : (Console/API) Modifier l'instance. (Changer le "Type d'Instance" (2.1)).
Exemple : db.r6g.large (2 vCPU, 16GB RAM) -> db.r6g.xlarge (4 vCPU, 32GB RAM).
Impact (Downtime) : OUI. (L'action nécessite (généralement) un reboot (Redémarrage) de l'instance BDD (downtime de 1-5 minutes)).
(AttĂ©nuation Multi-AZ) : Si vous ĂȘtes en Multi-AZ (4.1), le downtime est quasi-nul (secondes). AWS : 1. Modifie le Standby (d'abord) -> 2. Fait un Failover (le Standby devient Master) -> 3. Modifie l'ancien Master (maintenant Standby).
2. Augmentation Stockage (Disque) "Ă Chaud"
Action : (Console/API) Modifier l'instance. (Changer la "Allocated Storage").
Exemple : 100 GB (gp3) -> 150 GB (gp3).
Impact (Downtime) : ZĂRO (0). L'augmentation de la taille (GB) ou des IOPS (gp3/io1) (6.2) du stockage (EBS) se fait "Ă chaud" (live), sans redĂ©marrage (l'Ă©tat passe Ă Optimizing mais la BDD reste 100% Available).
(Bonne Pratique) : Activer "Storage Autoscaling" (2.2) (laisse AWS augmenter (UP) le disque (automatiquement) s'il détecte FreeStorageSpace < 10%).
8.2. Scalabilité Horizontale (Scale-Out) (Lecture)
C'est l'action d'ajouter (horizontalement) plus d'instances (copies) (au lieu de "grossir" (verticalement) 1 instance).
(Important) : C'est une scalabilitĂ© (presque) exclusivement pour la LECTURE (SELECT). (Le "Master" (Ăcriture) reste 1 goulot unique).
1. Read Replicas (Réplicas en Lecture) (RDS Standard)
C'est la méthode de scaling (manuelle) pour PostgreSQL, MySQL, MariaDB.
- Action : (Console) Clic "Create Read Replica" (sur le Master).
- Réplication : ASYNCHRONE (via
Binlog(MySQL) /WAL(Postgres)). - (PiÚge) : "Replication Lag" (Retard). Les données (
SELECT) lues sur la Read Replica (RR) peuvent ĂȘtre (lĂ©gĂšrement) obsolĂštes (ex: 50ms de retard) par rapport au Master (Ăcriture). - Usage : L'Application (Code) doit ĂȘtre "consciente" :
- Ăcritures (
INSERT,UPDATE) -> Endpoint Master. - Lectures (
SELECT) (non-critiques, BI, Analytics) -> Endpoint Read Replica.
- Ăcritures (
2. Aurora Reader Cluster (Aurora)
C'est la méthode (supérieure) de scaling pour Amazon Aurora.
- Action : "Add Reader" (Ajouter un lecteur) (jusqu'Ă 15 "Readers").
- RĂ©plication : Quasi-InstantanĂ©e (ms). Les "Readers" et le "Writer" partagent le mĂȘme Volume de Stockage (distribuĂ©) (4.4). (Pas de "Replication Lag" (disque)).
- Usage (Automatique) : Aurora fournit 1 Endpoint (DNS) "Reader" (
...-ro-...rds.amazonaws.com).- (L'Application (ex: BI) vise cet unique Endpoint "Reader").
- (Aurora) (DNS Round-Robin) Load Balance (répartit) (automatiquement) les connexions (
SELECT) sur tous les "Readers" (RR1, RR2, RR3...) disponibles.
8.3. Aurora Serverless v2 (Scalabilité "Micro-Second")
C'est un mode de déploiement (pour Aurora (3.3)) qui rend la Scalabilité Verticale (8.1) (CPU/RAM) instantanée, granulaire, et automatique.
Architecture (Sans Capacité Fixe)
Vous ne provisionnez pas une "Instance" (db.r6g.large). Vous provisionnez une Plage (Range) de "CapacitĂ©" (ACU = Aurora Capacity Unit â 2GB RAM).
Exemple (Configuration) :
Min ACU: 0.5(1GB RAM)Max ACU: 32(64GB RAM)
Flux (Automatique, "Micro-second" scaling)
- (Nuit, 03:00) (Idle) L'application (Dev/Test) ne reçoit aucune requĂȘte.
- (Aurora) Scale Down (Automatique) Ă
0.5 ACU(Coût minimum).
- (Aurora) Scale Down (Automatique) Ă
- (Matin, 09:01:00) (Pic) 500 utilisateurs (Django) se connectent. La charge (AAS) (7.3) monte.
- (Aurora) Scale Up (Instantané) (ex:
0.5 -> 8 ACU) (sans downtime, sans reboot) pour gérer le pic.
- (Aurora) Scale Up (Instantané) (ex:
- (Matin, 09:05:00) (Calme) La charge redescend.
- (Aurora) Scale Down (Instantané) (ex:
8 -> 2 ACU).
- (Aurora) Scale Down (Instantané) (ex:
Cas d'Usage (Charges Variables)
Idéal pour remplacer les instances db.t... (Burstable) (6.1).
- Environnements (Dev / Staging) : (Ne payez (presque) rien la nuit et le weekend).
- Applications (SaaS Multi-Tenant) : (La charge est imprévisible).
- APIs (Spiky) : (Trafic trĂšs "variable" (pics)).
(Inconvénient) : (Si charge constante 24/7) (ex: 8 ACU 24/7) -> Serverless v2 est (souvent) plus cher qu'une instance Provisionnée (ex: db.r6g.large) (surtout si l'instance est "Réservée" (RI/SP)).
8.4. Sharding / Partitionnement (CÎté Application)
C'est la stratĂ©gie de scalabilitĂ© "ultime" (et la plus complexe). C'est (gĂ©nĂ©ralement) la seule façon de scaler (horizontalement) l'ĂCRITURE (INSERT / UPDATE).
Le Goulot d'Ătranglement (Ăcriture)
(ProblĂšme) : Vous avez (scalĂ© verticalement) l'instance Master (Writer) la plus grosse (ex: db.r6g.32xlarge). Les Read Replicas (8.2) (Lecture) sont OK. Mais le Master (Ăcriture) est saturĂ© (100% CPU/IO) par les INSERT/UPDATE.
(Solution) : Le Sharding (Partitionnement Horizontal).
Architecture (Logique Applicative)
Le "Sharding" n'est pas une fonctionnalité RDS (sauf Aurora (complexe)). C'est une logique (complexe) que vous (Développeur) devez implémenter dans votre application (ex: Django).
Vous "partitionnez" (shardez) les données (ex: par UserID, TenantID, Region) sur plusieurs BDDs (Masters) indépendantes.
(Client App)
|
(Code Django / "DB Router")
|
(IF user_id % 2 == 0) (Pair)
|
v
[ đ Cluster RDS 1 (Shard 0) ] (Master R/W)
(Contient 50% des users (Pairs))
(IF user_id % 2 == 1) (Impair)
|
v
[ đ Cluster RDS 2 (Shard 1) ] (Master R/W)
(Contient 50% des users (Impairs))
InconvĂ©nients (ComplexitĂ© ExtrĂȘme)
- (Logique App) : L'application doit savoir (logique de "routage") sur quel "Shard" (BDD) elle doit écrire/lire.
- (Perte d'Intégrité) : Vous perdez les
JOINs (Jointures) (entre Shard 0 et Shard 1). Vous perdez les Transactions (ACID) (entre Shards). Vous perdez les ClĂ©s ĂtrangĂšres (Foreign Keys) (globales). - (Re-Sharding) : (Si Shard 1 est plein) Ajouter un 3Ăšme Shard (et "re-balancer" (rĂ©-Ă©quilibrer) les donnĂ©es) est une opĂ©ration (manuelle) extrĂȘmement complexe (downtime).
(Conclusion) : C'est une solution de "dernier recours" (utilisée par ex: Uber, Slack) (pour scalabilité massive), à n'utiliser qu'aprÚs avoir épuisé (8.1, 8.2, 8.3) et (6.4) (optimisation SQL).
7.1. CloudWatch Metrics (Niveau Hyperviseur)
C'est le monitoring de base (gratuit, 5 min) (ou "Detailed", payant, 1 min). Il mesure l'Hyperviseur (la "boßte" RDS) et le Disque (EBS). C'est idéal pour les Alarmes (7.5).
Il répond à : "Le serveur (CPU/RAM/Disque) est-il saturé (le symptÎme) ?"
Métriques Clés (à Alarmer)
| Métrique | Description (SymptÎme) | Seuil (Exemple Alarme) |
|---|---|---|
CPUUtilization | (CPU) Pourcentage d'utilisation du vCPU. | > 80% (pendant 15 min) (Goulot CPU) |
FreeableMemory | (Mémoire) RAM (OS) disponible (en Bytes). | < 200MB (Risque OOM (Out-of-Memory)) |
Read/WriteIOPS | (Disque I/O) IOPS (Opérations/sec) (Aléatoire). | (Corréler avec DiskQueueDepth) |
Read/WriteLatency | (Disque Latence) Temps (en ms) pour 1 I/O disque. | > 10ms (soutenu) (Le disque est saturé/lent) |
DiskQueueDepth | (Disque File Attente) Nb d'I/O (requĂȘtes) en attente (car le disque est saturĂ©). | > 1 (soutenu) (Goulot I/O majeur) |
DatabaseConnections | (Connexions) Nombre de connexions TCP actives. | > 80% (du max_connections (Parameter Group)) |
7.2. Enhanced Monitoring (Niveau OS)
C'est le monitoring optionnel (Opt-in, payant) qui mesure l'OS (SystÚme d'Exploitation) sous-jacent (Linux/Windows). Il fournit une granularité haute résolution (jusqu'à 1 seconde).
(Fonctionnement) : AWS installe un Agent (sur l'hÎte RDS) qui envoie les métriques (JSON) (trÚs détaillées) vers CloudWatch Logs.
Il répond à : "Le CPU (7.1) est à 90%. Quel process (OS) est le coupable ?"
Métriques Clés (OS-level)
processList(Liste des Processus) : (Le "Top" / "Htop") Affiche (ex: toutes les 5 sec) lePID,%CPU,%MEMde chaque process (ex:postgres: vacuum,postgres: select...,rds-agent).loadAverageMinute(Load Avg) : (load_1,load_5,load_15) (La "vraie" charge CPU (file d'attente run queue)).cpuUtilization(Détaillé) : (nice,system,user,wait(%iowait-> % CPU en attente du Disque (I/O) (Goulot Disque))).memory(Détaillé) : (active,free,buffers,cached) (Détail de l'utilisation RAM (OS Page Cache)).
7.3. Performance Insights (PI) (Niveau BDD/SQL)
C'est l'outil de monitoring (PaaS) le plus puissant (gratuit 7 jours, payant (rétention longue)). Il se concentre uniquement sur la performance (Charge) de la BDD (le moteur SQL).
Il rĂ©pond Ă : "Ma BDD est lente. Quelle requĂȘte SQL (Query) est la coupable, et Pourquoi (Wait Event) ?".
Analyse Temps Réel (Dashboard PI)
- 1. Database Load (AAS) : (Le Graphique Principal)
- AAS (Average Active Sessions) : Le nombre (moyen) de connexions "Actives" (soit sur le CPU, soit en Attente (Wait)).
- Max vCPU (Ligne Pointillée) : Votre limite (capacité) CPU (Instance).
- (Diagnostic) : Si la barre (AAS) dépasse (constamment) la ligne (Max vCPU) -> Votre BDD est en surcharge (Goulot).
- 2. Wait Events (Attentes) : (La "Couleur" de la barre AAS)
CPU(Vert) : Normal. La requĂȘte utilise le CPU (Calcul).IO:DataFileRead(Bleu) : Attente I/O (Disque). (SymptĂŽme :SELECTlent, Index manquant (6.4)).IO:XactSync(Bleu Ciel) : Attente I/O (Disque). (SymptĂŽme :COMMIT(Ăcriture) lent (Goulot Disque/EBS (6.2))).Lock:transactionid(Rouge) : Attente (Verrouillage). (SymptĂŽme : 2 requĂȘtes (UPDATE) se "battent" (bloquent) pour la mĂȘme ligne).
- 3. Top SQL (RequĂȘtes Lourdes) : (La "Liste" en bas)
- Classe (par "Charge AAS") les requĂȘtes SQL exactes (
SELECT * FROM users WHERE email=...) qui causent la charge (Wait Events) (ci-dessus).
- Classe (par "Charge AAS") les requĂȘtes SQL exactes (
(Flux de Diagnostic) : 1. Voir AAS > Max vCPU. 2. Voir "Couleur" = Bleu (IO:DataFileRead). 3. Voir "Top SQL" = SELECT * FROM users WHERE email=.... 4. (Conclusion) : "La requĂȘte (Top SQL) est lente (AAS) car elle attend le disque (Wait IO)". 5. (Action) : "Ajouter un Index (CREATE INDEX) sur la colonne email".
7.4. Logs Moteur (Error, Slow, Audit)
(Important) : Vous n'avez pas accĂšs (SSH) aux fichiers de logs (/var/log/...) sur l'instance RDS.
(Solution) : Vous devez (via la Console RDS) "Publier (Exporter)" les logs (de votre choix) vers Amazon CloudWatch Logs (pour consultation, alerte (Filtres), et archivage (vers S3)).
| Type de Log | Moteur | Activation (Comment ?) | Usage (Quoi ?) |
|---|---|---|---|
| Error Log (Journal d'Erreur) | Postgres (postgresql.log)MySQL ( error.log) | (Recommandé) Case à cocher "Error log" (Exporter vers CW Logs). | (Diagnostic Crash) Erreurs (Fatales), Panne (Startup), Checkpoints lents, Connexions (Auth) échouées. |
| Slow Query Log (RequĂȘtes Lentes) | Postgres MySQL/MariaDB | (RecommandĂ©) 1. Exporter vers CW Logs. 2. (Parameter Group) : (PG) log_min_duration_statement = 500 (ms)(MY) slow_query_log = 1, long_query_time = 1 (sec) | (Performance) Loggue (automatiquement) toutes les requĂȘtes SQL (SELECT...) qui dĂ©passent le seuil (ex: 500ms). (La source de donnĂ©es pour (6.4)). |
| Audit Log (Audit) | Postgres (pgaudit)SQL Server (Audit Natif) Oracle (Audit Natif) | (Compliance / Payant) 1. (Option Group) Activer le "plugin" (ex: pgaudit).2. (Parameter Group) Configurer pgaudit.log = 'all'. | (Audit Légal) Loggue (massivement) chaque action (ex: SELECT, DELETE, GRANT) faite par (Utilisateur) sur (Table). (Ex: "Qui a lu la table SALAIRES ?"). |
7.5. Alarmes & Alertes (CloudWatch Alarms)
Le monitoring (7.1, 7.2) collecte les données. Les Alarmes (PaaS) agissent (automatiquement) sur ces données (quand un "Seuil" (Threshold) est dépassé).
Alarmes Essentielles (Bonne Pratique)
Les 5 alarmes (basées sur les Métriques (7.1)) que toute BDD (Prod) devrait avoir :
- 1. (Surcharge CPU) :
- (Métrique)
CPUUtilization(Statistique:Average)> 80%(pendant 15 minutes).
- (Métrique)
- 2. (Surcharge RAM) :
- (Métrique)
FreeableMemory(Statistique:Minimum)< 200000000(Bytes) (< 200 MB) (pendant 5 minutes).
- (Métrique)
- 3. (Surcharge Disque (Stockage)) :
- (Métrique)
FreeStorageSpace(Statistique:Minimum)< 10000000000(Bytes) (< 10 GB). (Risquestorage-full).
- (Métrique)
- 4. (Surcharge Disque (I/O)) :
- (Métrique)
WriteLatency(Statistique:Average)> 20(ms) (pendant 5 minutes). (Indique goulot IOPS/Throughput).
- (Métrique)
- 5. (Surcharge Connexions) :
- (Métrique)
DatabaseConnections(Statistique:Maximum)> 500(Ajuster (ex: 80%) selon votremax_connections(Parameter Group)).
- (Métrique)
Intégration (Actions d'Alarme)
Quand l'Alarme (ci-dessus) passe à l'état ALARM, elle déclenche une Action :
- (Action) ->
Topic SNS (Simple Notification Service)
(Alerte CPU > 80%)
|
v
[ đ Alarme CloudWatch (Ătat=ALARM) ]
|
(Action: "Publish")
|
v
[ đŁ Topic SNS (Simple Notification Service) ]
|
+--- (Subscription 1: Email) ---> (Email: admin@equipe.com)
|
+--- (Subscription 2: Lambda) --> [ đ„ Lambda (Fonction) ]
| (
| Code Python (Requests):
| - Lit le JSON (SNS)
| - Formate le message
| - POST (HTTP) vers Webhook Slack/Teams
| )
|
+--- (Subscription 3: HTTPS) ---> (Endpoint: PagerDuty / OpsGenie (Alerte P1))
6.1. Choix de lâInstance (Compute)
Le choix de l'instance (CPU/RAM) est le premier levier de performance (et de coût).
| Famille | Type | Cas d'Usage | PiĂšge / Recommandation |
|---|---|---|---|
db.t... (Burstable) | (ex: db.t3.micro, db.t4g.small) | Dev / Test. Applications Ă trĂšs faible trafic (Blog). | (Anti-Pattern Prod) Utilise des CrĂ©dits CPU. Si les crĂ©dits sont Ă©puisĂ©s (ex: pic de trafic, requĂȘte lourde), le CPU est bridĂ© (throttled) et l'application plante (Timeout). |
db.m... (General Purpose) | (ex: db.m6g.large, db.m6i.large) | Prod (Standard). Bon équilibre CPU/RAM (Ratio 1:4). (Web App, API). | (Bon choix par défaut). |
db.r... (Memory-Optimized) | (ex: db.r6g.large, db.r7g.large) | (Recommandé BDD). Ratio CPU/RAM élevé (1:8). | (Best Practice) Les BDD (SQL) adorent la RAM (pour le Cache (6.3)). Plus de RAM = Moins d'I/O Disque (6.2) = Plus rapide. |
(FinOps) : Toujours préférer les instances g (Graviton/ARM) (ex: db.r6g.large) pour les moteurs open source (Postgres, MySQL, MariaDB). Elles offrent un meilleur rapport prix/performance (jusqu'à -30%) que les i (Intel) (x86).
6.2. Tuning du Stockage (EBS)
Le stockage (Disque) est (aprÚs la RAM) le goulot d'étranglement (bottleneck) n°1 des BDD (Workloads "I/O-Bound").
SSD gp3 vs io2 Block Express
gp3(SSD - General Purpose 3) :- (Le Standard) (99% des workloads).
- Baseline (Garantie) : 3 000 IOPS & 125 MB/s (Throughput).
- (Avantage Clé) : Vous pouvez scaler (augmenter) les IOPS (jusqu'à 16 000) et/ou le Throughput (jusqu'à 1000 MB/s) indépendamment de la Taille (GB) (facturation séparée).
io2 Block Express(SSD - Provisioned IOPS) :- (Usage Critique) BDD OLTP (SAP HANA, Oracle) nĂ©cessitant une latence sub-milliseconde et/ou des IOPS extrĂȘmes (garantis) (ex: 20 000, 40 000, max 256 000 IOPS).
- (Coût) : TrÚs cher (facturé au
$/GB+$/IOPS-provisionné).
IOPS (Workload OLTP) vs Throughput (Workload OLAP)
- (Workload OLTP) (ex: API, Django,
INSERT/UPDATE) :- (Nature) : Petites lectures/écritures (8KB/16KB) aléatoires.
- (Goulot) : Limité par les
IOPS(Opérations/seconde). - (Monitoring) : Surveiller
Read/WriteIOPS(CloudWatch) etDisk Queue Depth(6.6).
- (Workload OLAP) (ex: Analytics, BI,
SELECT COUNT(*)sur 1 Milliard lignes) :- (Nature) : Grosses lectures (1MB+) séquentielles (Full Table Scan).
- (Goulot) : Limité par le
Throughput(Débit, MB/s). - (Monitoring) : Surveiller
Read/WriteThroughput(CloudWatch).
6.3. Cache & Mémoire (Le "Saint Graal" de la Performance BDD)
La stratégie de performance n°1 est d'éviter le disque (lent). Pour cela, la BDD utilise la RAM (mémoire) (rapide) pour "cacher" (mettre en cache) les données et les index les plus fréquemment utilisés (le "Working Set").
(Objectif) : Avoir un Cache Hit Ratio (6.6) (Taux de T_ouche Cache) de > 99%.
Tuning (Parameter Groups)
| Moteur | ParamÚtre (Cache Principal) | Tuning (RDS Défaut) |
|---|---|---|
| MySQL / MariaDB (InnoDB) | innodb_buffer_pool_size | (Agressif) RDS (défaut) alloue ~75% de la RAM (DBInstanceClassMemory) de l'instance. |
| PostgreSQL | shared_buffers | (Conservateur) RDS (défaut) alloue ~25% de la RAM (DBInstanceClassMemory). (Pourquoi ? Postgres dépend aussi énormément du Cache SystÚme (OS Page Cache) (géré par Linux) (les 75% restants)). |
| Amazon Aurora | (Non applicable) | (Moderne) Aurora a un Buffer Cache (virtuel) partagé au niveau de la couche de stockage (le cache n'est pas "vidé" (invalidé) lors d'un failover (4.4)). |
6.4. Indexation & Optimisation de RequĂȘtes (SQL)
(La Cause n°1 de Lenteur Applicative) : L'instance (6.1) est énorme (.xlarge), le disque (6.2) est rapide (io2), mais l'application est lente.
(Cause) : Une requĂȘte SQL (mal Ă©crite) ou (le plus souvent) un Index (Index) manquant.
Flux de Diagnostic (Trouver le coupable)
- 1. Activer les "Slow Query Logs" (Logs de requĂȘtes lentes) (5.5) :
- (MySQL)
long_query_time = 1(1 sec) +log_queries_not_using_indexes = 1(Tuer les "Full Scans"). - (Postgres)
log_min_duration_statement = 500(500 ms). - (Alternative) Utiliser Performance Insights (AAS) (qui est un "Slow Log" visuel (temps-réel)).
- (MySQL)
- 2. Identifier (Identifier) la requĂȘte lente :
- (Logs)
SELECT * FROM users WHERE email = 'test@example.com';(Durée: 30 000 ms).
- (Logs)
- 3. Analyser (
EXPLAIN) le Plan d'Exécution :- (
psql)EXPLAIN ANALYZE SELECT * FROM users WHERE email = ...
- (
- 4. Lire le Plan (Rechercher les "Scans Séquentiels") :
- (Résultat)
-> Seq Scan on users (cost=0.00..50000.00 rows=1 width=...) - (Diagnostic) :
Seq Scan(Scan Séquentiel) = "Full Table Scan". La BDD lit 100% de la table (des millions de lignes) (I/O Disque massif) car il n'y a pas d'index suremail.
- (Résultat)
- 5. Corriger (
CREATE INDEX) :- (
psql)CREATE INDEX idx_users_email ON users (email); - (Nouveau Plan) :
-> Index Scan using idx_users_email on users (cost=0.42..8.44 rows=1 ...)(Durée: 2 ms).
- (
6.5. Parameter Groups & Option Groups
Puisque vous n'avez pas accÚs (SSH) au serveur (OS), vous ne pouvez pas éditer les fichiers (postgresql.conf, my.cnf) (locaux).
Vous (devez) gérer ces configurations (Moteur) via des Parameter Groups (PG) (managés) (via Console/API).
Parameter Groups (PG) (Le ".conf")
default.postgres15(PG par Défaut) : (Non-modifiable) Optimisé "générique".mon-app-prod-pg(PG Custom) : (Bonne Pratique)- Créer 1 PG "Custom" (basé sur le "Défaut").
- Modifier (Tuner) les paramĂštres (ex:
shared_buffers(6.3),log_min_duration_statement(6.4),work_mem(sort/hash),max_connections). - Attacher (Modify) ce PG (Custom) Ă l'instance RDS.
- (Statique vs Dynamique) : Certains paramĂštres (ex:
shared_buffers) sont "Statiques" (Static) et nĂ©cessitent un Reboot (RedĂ©marrage) de l'instance RDS (Ă appliquer durant la FenĂȘtre de Maintenance). D'autres (ex:log_min_duration_statement) sont "Dynamiques" (Dynamic) (appliquĂ©s "Ă chaud" (live)).
Option Groups (Les "Plugins")
C'est (similaire) mais utilisé pour activer des "fonctionnalités" (plugins, extensions) majeures (non-incluses par défaut).
- PostgreSQL : (Moins utilisé) (Les extensions (ex: PostGIS) sont gérées via le Parameter Group (
shared_preload_libraries)). - MySQL/MariaDB : (ex: Activer l'audit
MARIADB_AUDIT_PLUGIN). - Oracle/SQL Server : (TrÚs utilisé) (ex: Activer
TDE (Transparent Data Encryption),SQLSERVER_AUDIT,NATIVE_NETWORK_ENCRYPTION).
6.6. Monitoring I/O (Métriques Clés de Performance)
Comment savoir si votre BDD est "saturée" (goulot d'étranglement) ? Vous devez corréler les métriques (CloudWatch) (l'Effet) avec l'analyse (Performance Insights) (la Cause).
Métriques de Saturation (L'Effet / Le SymptÎme)
| Métrique (CloudWatch / PI) | Signification (SymptÎme) | Action (Diagnostic) |
|---|---|---|
CPUUtilization (CW) > 90% | Goulot CPU. (Le CPU (Calcul) est saturĂ©). | 1. Performance Insights (AAS) : Regarder "Top SQL" (6.4) (Quelle requĂȘte SQL ?). 2. (Si Wait Event = CPU) -> La requĂȘte est (lĂ©gitimement) lourde (GROUP BY, ORDER BY). -> (Action: Optimiser SQL/Index, ou Scaler (Upgrade) l'Instance (6.1)). |
FreeableMemory (CW) < 100MB | Goulot RAM. (L'instance n'a plus de RAM disponible). | (Risque OOM Killer) 1. Performance Insights (Cache Hit Ratio) : Regarder si < 99% (6.3). 2. (Si < 99%) -> Le "Working Set" (données/index) ne tient plus en RAM. 3. (Action) -> Scaler (Upgrade) l'Instance (ex: r6g.large -> r6g.xlarge) (plus de RAM (6.1)). |
Disk Queue Depth (CW) > 1 (soutenu) | Goulot Disque (IOPS/Throughput). (Les requĂȘtes (I/O) arrivent (file d'attente) plus vite que le Disque (EBS) ne peut les traiter). | 1. Performance Insights (AAS) : Regarder "Wait Events" (ex: IO:DataFileRead, IO:XactSync).2. (Si gp2/gp3) : L'application (SELECT/COMMIT) sature (throttle) les IOPS (6.2) du volume EBS.3. (Action) -> Augmenter (Scaler) les IOPS (ou le Throughput) (sur le volume gp3). |
5.1. IAM (Gestion des API / Control Plane)
Il faut différencier deux niveaux de sécurité : 1) L'API AWS (Control Plane) et 2) La connexion BDD (Data Plane).
IAM (Identity and Access Management) gĂšre le Control Plane (Actions sur le service RDS).
IAM répond à la question : "Qui (Utilisateur/Admin) a le droit de gérer (modifier) l'infrastructure RDS ?"
Exemples de Permissions IAM (Control Plane)
{
"Effect": "Allow",
"Action": [
"rds:CreateDBInstance", // (Droit de créer une BDD)
"rds:ModifyDBInstance", // (Droit de la scaler/modifier)
"rds:RebootDBInstance", // (Droit de la redémarrer)
"rds:DeleteDBInstance", // (Droit de la supprimer)
"rds:CreateDBSnapshot", // (Droit de faire un backup manuel)
"rds:DescribeDBInstances" // (Droit de la voir/lister)
],
"Resource": "*"
}
IAM (Data Plane) (Exception)
Par défaut, IAM ne gÚre pas le login (SELECT, INSERT) de la BDD (ça, c'est le "Master User" (postgres) et le mot de passe).
(Exception - Bonne Pratique) : Vous pouvez activer "IAM DB Authentication" (sur Postgres/MySQL). Cela permet Ă une application (EC2/Lambda) (via son IAM Role rds-db:connect) de gĂ©nĂ©rer un Token (temporaire, 15min) et d'utiliser ce Token comme mot de passe pour se connecter Ă la BDD. (Ăvite de gĂ©rer des mots de passe statiques (5.4)).
5.2. Connexion Réseau (VPC & Security Groups)
C'est la couche de sécurité Réseau (L3/L4). Comment la BDD est-elle isolée ?
No Public Access (Bonne Pratique n°1)
Une BDD RDS ne doit jamais ĂȘtre publique. Lors de la crĂ©ation (Configuration "Connectivity"), Public Access doit toujours ĂȘtre sur No.
Placement (Subnets Privés)
La BDD doit "vivre" dans votre VPC (isolée), dans un "DB Subnet Group". Ce groupe doit contenir (uniquement) des Subnets Privés (ou "Isolés") (cà d : des Subnets dont la Route Table n'a PAS de route vers un Internet Gateway (IGW)).
Security Groups (SG) Stricts (Le Vrai Pare-feu)
Le Security Group (SG) est le pare-feu (Stateful) attaché à l'ENI (Instance) de RDS. C'est lui qui contrÎle le Data Plane (qui peut parler au Port 5432 ?).
(Mauvais) : Allow TCP/5432 (Postgres) (Source: 0.0.0.0/0 (Public)) -> (Faille de sécurité massive).
(Moyen) : Allow TCP/5432 (Source: 10.0.1.0/24 (CIDR du Subnet App)) -> (OK, mais trop permissif).
(Meilleur - Least Privilege) : Allow TCP/5432 (Source: sg-app-server (L'ID du SG de l'App EC2/Lambda)).
RĂšgle (Inbound) du sg-db (RDS) | Source | Description |
|---|---|---|
| PostgreSQL (TCP 5432) | sg-app-server | Autorise uniquement les instances portant l'étiquette sg-app-server (vos EC2/Lambda) à se connecter. |
5.3. Encryption (Chiffrement At-Rest & In-Transit)
Encryption at-Rest (Chiffrement au Repos)
C'est le chiffrement du disque (Volume EBS) sous-jacent (oĂč les fichiers de donnĂ©es (.dat) sont stockĂ©s). C'est une case Ă cocher ("Enable Encryption") lors de la crĂ©ation de la BDD.
- (Obligatoire) : Vous ne pouvez pas chiffrer une BDD (non-chiffrée) existante. (Il faut Snapshot -> Copy Snapshot (en chiffrant) -> Restore).
- (Clé) : Utilise AWS KMS (Key Management Service).
- Clé (Défaut) :
aws/rds(Clé managée par AWS, gratuite, pas d'audit). - Clé (CMK) : (Recommandé) Votre propre Customer Managed Key (Clé gérée par le client). (Permet l'audit (CloudTrail), la rotation, et la gestion (IAM Policy) de qui peut "utiliser" (chiffrer/déchiffrer) les backups).
- Clé (Défaut) :
- (PérimÚtre) : Chiffre le volume (EBS), les Read Replicas (automatiquement), et les Snapshots (automatiquement).
Encryption in-Transit (Chiffrement en Transit)
C'est le chiffrement (SSL/TLS) de la connexion (réseau) entre votre Application (ex: Django) et l'Endpoint (Serveur) RDS.
- (Serveur) : RDS (le service) gĂšre (automatiquement) l'installation et la rotation des certificats SSL (publics) sur l'instance BDD.
- (Client) : C'est la responsabilité de l'Application (Client) de forcer (
require) et de vérifier (verify) la connexion SSL.
(Exemple psql (Postgres) / settings.py (Django)) :
# (Django DATABASES 'OPTIONS')
'OPTIONS': {
'sslmode': 'verify-full', # (Force SSL + Vérifie le Certificat (CA))
'sslrootcert': '/path/to/aws-rds-ca-bundle.pem' # (Chemin du Bundle CA (Trust) d'AWS)
}
# (psql CLI)
$ psql "... host=... user=... sslmode=verify-full"
5.4. Secrets Manager & Parameter Store
(Le ProblĂšme) : OĂč stocker le mot de passe (Master User) de la BDD (Data Plane) ?
(Anti-Pattern) : "Hardcoder" (écrire en dur) le mot de passe dans le code (settings.py), dans un .env (sur l'EC2), ou dans les Variables d'Environnement (Lambda) (visibles en clair dans la console).
La Solution : AWS Secrets Manager
Secrets Manager est un service (PaaS) dédié au stockage (chiffré via KMS) et à la rotation (automatique) des secrets (ex: Mots de passe BDD, Clés API).
Flux (Application Django/EC2/Lambda)
- (Admin) (Secrets Manager) Vous créez un "Secret" (ex:
prod/rds/main-db) (stocke{"username":"admin", "password":"Password123", "host":"...rds..."}). - (Admin) (IAM) Vous donnez (via un IAM Role) Ă votre EC2/Lambda (l'application) la permission
secretsmanager:GetSecretValue(sur l'ARN du secret). - (Application) (Au démarrage /
settings.py) L'application (Boto3) appelle (API) Secrets Manager (GetSecretValue) (via son IAM Role, sans clés d'accÚs). - (Application) RécupÚre le JSON (mot de passe) en mémoire (RAM) et l'utilise pour se connecter à RDS.
Rotation Automatique (La "Magie")
C'est la fonctionnalité clé de Secrets Manager (vs SSM Parameter Store (Simple)).
- (Config) Vous activez la Rotation (Automatique) (ex: tous les 30 jours).
- (Flux) (Tous les 30 jours) Secrets Manager (via une Lambda (interne) de rotation) :
- Se connecte Ă RDS (avec l'ancien mot de passe).
- Change le mot de passe (
ALTER USER ... PASSWORD ...). - Stocke (met Ă jour) le nouveau mot de passe dans le "Secret".
(Résultat) : Le mot de passe (BDD) est changé (automatiquement) tous les 30 jours, sans intervention humaine et sans redéployer l'application (l'application (3) récupÚre le nouveau mot de passe au prochain (re)démarrage).
5.5. Audit & Logs (Moteur BDD)
(Important) : RDS (PaaS) ne vous donne pas accĂšs (SSH) aux fichiers de logs (ex: /var/log/postgresql/postgresql.log) sur le disque.
(Solution) : Vous devez "Exporter (Publier)" ces logs (via une case Ă cocher) vers Amazon CloudWatch Logs (pour consultation, analyse (Logs Insights), et archivage (vers S3)).
Logs Open Source (PostgreSQL / MySQL)
Vous (Admin) contrÎlez "ce qui est loggué" via le DB Parameter Group (le postgresql.conf / my.cnf managé).
- PostgreSQL Logs :
- (Exporter) Activer
postgresql.log(Export vers/aws/rds/instance/.../postgresql). - (Tuning)
log_min_duration_statement = 500(Bonne Pratique : Logguer toutes les requĂȘtes SQL (SELECT,UPDATE...) qui prennent plus de 500 ms (pour trouver les requĂȘtes lentes)).
- (Exporter) Activer
- MySQL / MariaDB Logs :
- (Exporter) Activer
slow_query_log,error_log,general_log. - (Tuning)
long_query_time = 1(Logguer les requĂȘtes > 1 seconde). - (Tuning)
log_queries_not_using_indexes = 1(Bonne Pratique : Logguer les requĂȘtes (lentes) qui font des "Full Table Scans" (Index manquant)).
- (Exporter) Activer
Audit Logging (Commercial / Avancé)
Pour les moteurs commerciaux (ou compliance stricte).
- Oracle / SQL Server : RDS supporte (via "Options Groups") l'Audit Natif (ex: "SQL Server Audit"). (Ex: "Auditer (logguer) tous les
SELECT,DELETEsur la tableCOMPTA.SALAIRES"). - PostgreSQL (Audit) : (Alternative) Activer l'extension
pgaudit(via Parameter Group). - (Tous ces logs (détaillés) sont (aussi) exportés vers CloudWatch Logs).
4.1. Multi-AZ (Classique - 1 Standby)
C'est la fonctionnalité (option "Production") pour la Haute Disponibilité (HA) (Résilience aux pannes). Cela ne concerne pas la performance (Scaling) en lecture.
Objectif : Assurer la continuité de service si 1 Datacenter (AZ) tombe en panne.
Architecture
- Composants : 1 Master (Primaire) (Actif, R/W) (ex: AZ-A) + 1 Standby (Secondaire) (Passif, pas de lecture) (ex: AZ-B).
- Réplication : SYNCHRONE. (Un
COMMIT(écriture) n'est "OK" (validé) que lorsque la donnée est écrite (ACK) sur le disque (EBS) du Master ET sur le disque (EBS) du Standby).- (Impact : LégÚre augmentation de la latence en écriture (Write Latency)).
Basculement (Failover) Automatique
- Scénario : (Panne) L'instance Master (AZ-A) tombe (panne Hardware/AZ).
- (1) Détection : AWS (RDS) détecte la panne (Health Check).
- (2) Bascule DNS : AWS (RDS) met Ă jour (bascule) l'Endpoint (DNS) (2.3) (
...rds.amazonaws.com) pour qu'il pointe vers l'IP (privée) du Standby (AZ-B). - (3) Promotion : AWS "promeut" le Standby (AZ-B) en nouveau Master (R/W).
(Downtime) : Le basculement prend ~30 Ă 60 secondes (le temps que le DNS (TTL 60s) se propage et que le Standby soit promu).
(Endpoint InchangĂ©) : Votre application (Django) n'a rien Ă changer. Elle continue de viser le mĂȘme Hostname (Endpoint) (qui pointe maintenant vers la nouvelle IP (Master)).
4.2. Multi-AZ with 2 Readable Standbys (Cluster)
C'est une nouvelle architecture (moderne) (disponible pour Postgres/MySQL sur les instances (ex: db.r6i, db.r6g)) qui combine HA (3 AZs) et Scaling en Lecture (similaire Ă Aurora).
Architecture
- Composants : 1 Master (Primaire) (Actif, R/W) (AZ-A) + 2 Standby (Secondaires) (Actifs, Read-Only) (AZ-B et AZ-C).
- AZs : Déploiement (obligatoire) sur 3 Availability Zones.
- Stockage : Utilise (généralement)
io1/io2(local SSD (Instance Store) pour le "redo log").
Avantages vs Multi-AZ (Classique)
- Performance I/O (Ăcriture) : Les "commits" (
COMMIT) sont plus rapides (jusqu'à 2x) car la réplication (tx log) est optimisée (le Master n'attend qu'1 seul Standby (quorum), pas les deux). - Performance (Lecture) : Les 2 Standby sont actifs (Read-Only). (Contrairement au Standby "classique" (4.1) qui est passif). Vous pouvez (via un "Reader Endpoint") décharger les
SELECTsur ces 2 Standby (similaire aux Read Replicas (4.3)). - Failover (Basculement) : Le basculement (Failover) est (généralement) plus rapide (souvent < 35 secondes).
4.3. Read Replicas (Réplicas en Lecture)
C'est la fonctionnalité (manuelle) pour le Scaling en Lecture (Performance). Ce n'est PAS (par défaut) une solution de Haute Disponibilité (HA).
Architecture (Asynchrone)
- Composants : 1 Master (R/W) -> (jusqu'Ă 15) Read Replicas (RR) (Read-Only).
- Réplication : ASYNCHRONE. (Utilise la réplication native (
Binlog(MySQL) /WAL(Postgres))). - (Le PiÚge - "Replication Lag") : L'écriture (
COMMIT) sur le Master (R/W) est (immĂ©diate). La donnĂ©e peut prendre (ex:) 50ms Ă 10 secondes (ou plus) pour arriver (ĂȘtre rĂ©pliquĂ©e) sur la Read Replica (R/O).
Cas d'Usage (Scaling en Lecture)
ProblÚme : Mon Master (db.r6g.large) (100% CPU) est saturé par les SELECT (lourds) de mon équipe "BI / Analytics".
Solution :
- Créer 1 Read Replica (
db.r6g.large). - (L'App (Prod) continue de viser le Master).
- (L'équipe BI) Vise (via son outil, ex: Metabase) l'Endpoint (DNS) (séparé) de la Read Replica.
- (Résultat) : Les
SELECT(lourds) sont déchargés sur la RR. Le Master (CPU 20%) respire.
Failover Manuel (DR)
Si le Master (db-master) meurt (panne non-Multi-AZ) :
- (Action Manuelle) Vous pouvez "Promouvoir" (Promote) la Read Replica (
db-rr). - (Résultat) La RR (
db-rr) est "cassée" (détachée) du Master (mort) et devient une nouvelle instance Master (R/W) (avec un nouvel Endpoint). - (Risque) Vous perdez les données (
COMMITs) qui étaient "en vol" (dans le "Replication Lag") (non-encore répliquées).
4.4. Amazon Aurora (Haute Disponibilité)
Aurora (3.3) utilise une architecture (Cloud-Native) fondamentalement différente (stockage partagé), ce qui change (améliore) radicalement la HA.
Stockage Distribué (6 Copies / 3 AZ)
Le Stockage (Volume) (PaaS) est partagé. Il n'est pas attaché (EBS) à une instance.
- Architecture (Storage) : 1 Volume (ex: 128TB), qui écrit (automatiquement) 6 copies de vos données (blocs), réparties sur 3 AZs (2 copies / AZ).
- TolĂ©rance (Ăcriture) : A besoin d'un Quorum "4 sur 6" (Write Quorum). (Peut survivre Ă la perte totale d'1 AZ (2 copies) + 1 autre nĆud (1 copie) et continuer d'Ă©crire).
- Auto-Healing (Auto-Réparation) : Si le stockage (dans l'AZ-A) est corrompu (bit rot), Aurora (automatiquement) le répare (auto-heal) en utilisant les copies (saines) (AZ-B, AZ-C).
Instant Failover (Basculement Instantané)
Dans un Cluster Aurora, vous avez 1 "Compute" (Instance) Writer (Master) et (jusqu'Ă 15) "Compute" (Instances) Readers (Replicas). (Tous lisent/Ă©crivent sur le mĂȘme Volume (partagĂ©)).
- Scénario : (Panne) L'instance Writer (Master) (Compute) (AZ-A) tombe (panne EC2).
- (1) Détection : Aurora détecte (immédiat).
- (2) Promotion : Aurora promeut (immédiat) une Read Replica (ex: AZ-B) au rang de Writer (elle a déjà accÚs au stockage partagé).
(Downtime) : < 10 secondes (parfois < 5 sec). (Pas d'attente DNS (4.1) si vous utilisez le Reader Endpoint (2.3) (qui détecte la promotion), ou le RDS Proxy (qui gÚre le failover)).
4.5. Backups Automatiques & Point-In-Time Restore (PITR)
C'est la fonctionnalité de Durabilité (Humaine) (protection contre DELETE FROM users; (erreur humaine)).
1. Backups Automatiques (Snapshots)
- (Activé par Défaut) (Rétention : 1 à 35 jours (ex: 7 jours)).
- FenĂȘtre (Backup Window) : (Ex: 02:00-02:30 UTC) AWS prend 1 Snapshot (EBS) (sauvegarde complĂšte/incrĂ©mentale) du volume (disque), 1x / jour.
2. Point-In-Time Restore (PITR) (Restauration Ă la Seconde)
Pour permettre le PITR (restauration "entre" les snapshots), RDS (en plus des snapshots) capture (continuellement) les Logs de Transaction (WAL (Postgres) / Binlog (MySQL)) et les envoie (toutes les 5 min) vers S3 (stockage interne).
Flux (Restauration)
(Scénario) : Mardi 14:32:10 -> DELETE FROM users; (Erreur).
- (Admin) Console RDS -> "Restore to point in time".
- (Admin) Choisit "Custom". Date/Heure : Mardi 14:32:05 (5 secondes avant le
DELETE). - (Admin) Donne un Nouveau Nom (ex:
ma-bdd-restored). - (Flux AWS) :
- (AWS) 1. RécupÚre le dernier Snapshot (celui de 02:00 UTC).
- (AWS) 2. Crée une nouvelle BDD (
-restored) (état 02:00). - (AWS) 3. "Rejoue" (Replay) (en accéléré) les Logs de Transaction (stockés sur S3) (de 02:00:00 à 14:32:05).
(Résultat) : Une nouvelle instance BDD (avec un nouvel Endpoint) est créée, contenant les données exactes à 14:32:05.
Snapshots Manuels
(Action : Clic "Take Snapshot"). C'est un backup (manuel) (ex: snap-avant-migration) qui est conservĂ© (Retained) (et facturĂ©) mĂȘme si vous supprimez l'instance RDS (contrairement aux Backups Auto (qui sont supprimĂ©s)).
3.1. PostgreSQL (sur RDS)
(Recommandé pour les nouvelles applications) Le moteur "open source" le plus avancé, idéal pour les applications complexes (ex: Django, Rails) et les charges de travail géospatiales ou JSON.
Extensions (Whitelist)
(PiÚge) : Vous n'avez pas l'accÚs SUPERUSER (géré par AWS). Vous ne pouvez pas installer n'importe quelle extension (CREATE EXTENSION ...). Vous ne pouvez activer que les extensions "whitelistées" (pré-approuvées) par AWS (via le "Parameter Group" shared_preload_libraries et CREATE EXTENSION).
Extensions Clés Supportées :
postgis: (Le standard) Support des donnĂ©es GĂ©ospatiales (GIS).pg_stat_statements: (Monitoring) Outil essentiel pour tracer les requĂȘtes SQL lentes (utilisĂ© par Performance Insights).pg_cron: Permet de planifier (scheduler) des jobs (ex:VACUUM,DELETE) directement dans la BDD (comme uncronLinux).uuid-ossp: (Utile) GĂ©nĂ©ration deUUIDs.
Fonctionnalités Avancées (JSONB)
JSONB (Binary JSON) : L'atout majeur de Postgres. Permet de stocker (nativement) des documents JSON (NoSQL-like) et (surtout) de les indexer (GIN Index) pour des requĂȘtes (rapides) Ă l'intĂ©rieur du JSON. (Combine SQL (relationnel) et NoSQL (document)).
Gestion des Schémas (Schemas) : Postgres gÚre (nativement) les "Schemas" (espaces de noms logiques) pour isoler (proprement) les tables (ex: schema_app, schema_analytics) (multi-tenant) dans 1 seule BDD (Database).
3.2. MySQL & MariaDB (sur RDS)
(Populaire/Legacy) Le moteur "open source" (LAMP) le plus déployé au monde (ex: WordPress, Drupal, Magento). MariaDB est son "fork" (dérivé) communautaire (100% compatible).
Avantages & Limites
- (Avantage) : ExtrĂȘmement mature, rapide (pour les lectures simples/indexĂ©es), et (trĂšs) large Ă©cosystĂšme.
- (Avantage) : Plus simple (pour les débutants) que PostgreSQL.
- (Limite) : Moins "riche" en fonctionnalités avancées (le support JSON (natif) est moins performant que JSONB, pas de DDL transactionnel...).
Réplication (Binlog)
La réplication (pour les Read Replicas, ou pour répliquer (en externe) vers une EC2/On-Prem) est basée sur le binlog (Binary Log).
- (Backups) : RDS doit avoir les Backups Automatiques (activés) (Rétention > 0 jours) pour activer le
binlog(requis pour les Read Replicas). - (AccĂšs) : RDS (via
Parameter Group) vous donne accÚs (contrÎle) au format dubinlog(binlog_format=ROW(recommandé),STATEMENT,MIXED).
Tuning (Innodb Buffer Pool)
Le paramĂštre (Parameter Group) le plus critique (performance) pour MySQL (Moteur InnoDB) est innodb_buffer_pool_size.
C'est la RAM (Cache) allouĂ©e au moteur (pour garder les index et les donnĂ©es "chaudes" en mĂ©moire). RDS (par dĂ©faut) le rĂšgle (intelligemment) Ă (environ) 75% de la RAM (totale) de l'Instance (db.r6g.large = 16GB RAM -> Buffer Pool â 12GB).
3.3. Amazon Aurora (Cloud-Native)
(Recommandé par AWS) Aurora n'est pas un nouveau moteur. C'est une architecture (PaaS) "Cloud-Native" qui est compatible (Frontend) avec PostgreSQL ou MySQL, mais qui utilise un Moteur de Stockage (Backend) custom (propriétaire AWS).
Stockage Distribué (La "Magie")
C'est la différence clé. (RDS Standard = 1 Instance + 1 Disque EBS). (Aurora = 1 Instance + 1 Volume "virtuel" (Storage Layer)).
- Stockage (PaaS) : Le volume (stockage) est séparé du calcul (instance).
- RĂ©plication (6x) : Vos donnĂ©es (Data) sont copiĂ©es (rĂ©pliquĂ©es) 6 fois, sur 3 AZs (2 copies par AZ). (TolĂ©rance : Survit Ă la perte de 1 AZ + 1 autre nĆud).
- (Vitesse) : Les "Writes" (Ăcritures) sont (plus) rapides (que RDS) car Aurora n'Ă©crit que les "Logs" (Log-Structured Storage) (pas de "checkpoints" / "double write buffer" comme MySQL/Postgres).
(Marketing) : AWS annonce : 5x plus rapide que MySQL (standard) / 3x plus rapide que PostgreSQL (standard).
Haute Disponibilité (Failover)
- (RDS Standard) : 1 Master (Active) + 1 Standby (Passive, Synchrone). (Failover = 30-60 sec).
- (Aurora) : 1 Master (Active, Ăcriture) + 15 Read Replicas (Actives, Lecture) (partagent le mĂȘme stockage).
- (Failover) : Si le Master (Ăcriture) tombe, Aurora promeut (en < 10 secondes) une Read Replica (au choix) en nouveau Master. (Failover quasi-instantanĂ©).
Aurora Serverless v2
Une version (moderne) d'Aurora qui auto-scale (automatiquement) le Compute (CPU/RAM) à la volée (sans downtime), en fonction de la charge (AAS).
- (Config) : Vous définissez une plage (ex: Min 0.5 ACU (1GB) -> Max 16 ACU (32GB)).
- (Flux) : (Nuit, 0% charge) -> Aurora "scale down" à 0.5 ACU (Coût minime). (Matin, 9h) -> (Pic de charge) -> Aurora "scale up" (immédiat) à 16 ACU.
- (Usage) : Idéal pour Dev/Test, ou applications "imprévisibles" (spiky).
3.4. Oracle (sur RDS)
(Usage : Migration "Lift & Shift") Permet de migrer des BDD (Oracle) "legacy" (On-Premise) vers AWS (en mode PaaS).
Ăditions SupportĂ©es
- Oracle Database Enterprise Edition (EE) : (Haut de gamme, toutes options).
- Oracle Database Standard Edition 2 (SE2) : (Standard).
- (RDS ne supporte pas "Express Edition" (XE) (Gratuit)).
Options de Licence (Le PiĂšge)
C'est le point le plus complexe (et le plus cher) d'Oracle sur AWS.
| ModĂšle | Description | Facturation | Contrainte |
|---|---|---|---|
| 1. License Included (LI) | (PaaS) AWS fournit la licence (louĂ©e). | ExtrĂȘmement Cher (PayĂ© $/vCPU/Heure). (Ex: 1 Instance db.r5.large (2 vCPU) = $0.17/h (Instance) + $0.80/h (Licence EE) = $0.97/h). | Simple (Pas de gestion de licence). |
| 2. BYOL (Bring Your Own License) | (IaaS-like) Vous apportez vos licences (On-Premise) existantes (avec "Software Assurance" / MobilitĂ©). | (Prix Instance uniquement) ($0.17/h). | Contrainte MatĂ©rielle (Licence Oracle) : (Pour ĂȘtre "compliant" (licence Oracle)), vous devez (gĂ©nĂ©ralement) exĂ©cuter RDS/EC2 (BYOL) sur un HĂŽte DĂ©diĂ© (Dedicated Host) (facturĂ© au serveur physique entier) pour "verrouiller" (pin) la licence aux CĆurs/Sockets physiques. |
3.5. Microsoft SQL Server (sur RDS)
(Usage : Migration "Lift & Shift") Permet de migrer des BDD (MS SQL) "legacy" (On-Premise) (ex: applications .NET, SharePoint) vers AWS (en mode PaaS).
Ăditions SupportĂ©es
- SQL Server Express Edition : (Gratuit, limité 10GB / 1 vCPU / 1GB RAM). (OK pour Dev/Test).
- SQL Server Web Edition : (Moins cher) (Uniquement "License Included").
- SQL Server Standard Edition : (Standard).
- SQL Server Enterprise Edition : (Haut de gamme).
Options de Licence (Plus simple qu'Oracle)
- 1. License Included (LI) : (Défaut / Recommandé) AWS fournit la licence (intégrée au coût
$/Heurede l'instance). Vous payez ce que vous consommez. - 2. BYOL (Bring Your Own License) : (Si vous avez des licences (On-Prem) avec "Software Assurance" (SA) (Mobilité de Licence)). Vous ne payez (à AWS) que le coût "Instance" (Compute). (Peut (contrairement à Oracle) s'exécuter sur du matériel "Shared" (Défaut), pas besoin (obligatoire) de "Dedicated Host").
Fonctionnalités Spécifiques
- Multi-AZ : RDS (SQL Server) utilise la technologie "Database Mirroring (DBM)" (Legacy) ou "Always On Availability Groups (AGs)" (Moderne/Enterprise) pour gérer la réplication (Synchrone) Multi-AZ.
- Authentification : Supporte "Windows Authentication" (Kerberos) (via intégration avec AWS Managed Microsoft AD).
2.1. Instances RDS (Compute & Mémoire)
L'Instance RDS est la couche "Compute" (Calcul) de votre base de données. C'est l'équivalent d'une EC2 optimisée, sur laquelle vous ne pouvez pas vous connecter (SSH). Elle fournit le CPU (vCPU) et la Mémoire (RAM).
L'architecture RDS découple (sépare) le "Compute" (Instance) du "Stockage" (Volume EBS).
Types d'Instance (Nomenclature)
La nomenclature est db.[famille][génération][attribut].[taille] (ex: db.r6g.large).
- Famille (CPU/RAM) :
db.t...(Burstable) : (ex:db.t3.micro,db.t4g.small). (Pour Dev/Test). Utilise des "Crédits CPU". (Ne jamais utiliser en production, risque de "throttling" (bridage) CPU).db.m...(General Purpose) : (ex:db.m6i.large,db.m6g.large). (Ratio CPU/RAM équilibré (1:4)). (Bon début pour la production).db.r...(Memory Optimized) : (ex:db.r6i.large,db.r7g.large). (Recommandé BDD). Ratio CPU/RAM élevé (1:8). (La RAM est critique pour les BDD (index, cache)).
- Attribut (Processeur) :
i: Intel (Processeur x86_64).g: Graviton (ARM). (Recommandé FinOps) (arm64). Offre un meilleur rapport prix/performance (jusqu'à -30%) (Postgres, MySQL, MariaDB y sont hautement optimisés).
(I/O EBS) : Le type d'instance (ex: .large) définit aussi la bande passante (débit) maximale (ex: 4,750 Mbps) disponible entre l'Instance (Compute) et le service de Stockage (EBS) (via le réseau "EBS-Optimized").
2.2. Stockage (EBS)
C'est la couche "Disque Dur" (persistante) de votre BDD. RDS utilise des volumes EBS (Elastic Block Store) (stockage réseau).
Types de Stockage (SSD vs HDD)
| API | Type | Performance (IOPS/Throughput) | Cas d'Usage (Workload) |
|---|---|---|---|
gp3 | SSD (General Purpose 3) | Baseline Garantie : 3 000 IOPS & 125 MB/s (indépendamment de la taille). (Scalable indépendamment). | (Recommandé / Défaut). 99% des workloads (Dev, Test, Prod Standard). Excellent rapport prix/perf. |
io1 / io2 | SSD (Provisioned IOPS) | IOPS Garantis (ProvisionnĂ©s) (ex: 20 000 IOPS). Latence sub-ms. | (Prod Critique / OLTP) BDD (SQL Server, Oracle) avec des besoins en I/O (alĂ©atoire) extrĂȘmes et garantis. (TrĂšs cher). |
magnetic | HDD (Magnetic) | Faible (IOPS bas). | (Déprécié / Legacy). (Coût $/GB le plus bas). (Uniquement pour tests ou archives froides si gp3/st1 non dispo). |
Storage Autoscaling
C'est une option (case à cocher) à la création (ou modification) de l'instance.
(ProblÚme) : Votre BDD (100GB) se remplit (INSERT massifs). Elle atteint 100% (Full). RDS passe (automatiquement) la BDD en mode storage-full (Lecture Seule). L'application plante (INSERT échouent).
(Solution) : Activer Storage Autoscaling (ex: Max 1000 GB).
- (AWS) Monitore la métrique
FreeStorageSpace. - (AWS) Si l'espace libre est (trop bas) -> Augmente (automatiquement) le disque (ex: +10%) sans downtime.
(Attention) : Le Storage Autoscaling ne scale que vers le HAUT (UP). Il ne réduit (DOWN) jamais la taille du disque (vous devez le faire manuellement via Snapshot/Restore).
2.3. Endpoints RDS (Le "Hostname" DNS)
Vous ne vous connectez jamais à une BDD RDS via son IP Privée (car elle change lors d'un Failover, Restore, ou Stop/Start). Vous utilisez toujours l'Endpoint (Hostname DNS) (géré par AWS via Route 53).
1. Endpoint Principal (Instance / Cluster)
C'est l'Endpoint (DNS) principal. Il pointe toujours vers l'instance Master (Ăcriture / Write).
# (Exemple : Endpoint Principal / "Cluster Endpoint")
mon-db-prod.cluster-cabcdef123.eu-west-3.rds.amazonaws.com
(Multi-AZ Endpoint) : C'est CE MEME endpoint ! Si vous ĂȘtes en Multi-AZ (HA) et que l'instance Master (AZ-A) tombe en panne :
- RDS (automatiquement) "promeut" le Standby (AZ-B) en nouveau Master.
- RDS (automatiquement) met Ă jour (bascule) ce DNS (
mon-db-prod.cluster...) pour qu'il pointe vers l'IP privĂ©e (AZ-B) du nouveau Master. - (L'application (Django) n'a rien Ă changer, elle continue de viser le mĂȘme Hostname).
2. Reader Endpoint (Endpoint Lecture) (Aurora Uniquement)
Si vous utilisez AWS Aurora (et que vous avez créé 1 Master + 3 Read Replicas) :
# (Exemple : Endpoint Lecture (Read Replica))
mon-db-prod.cluster-ro-cabcdef123.eu-west-3.rds.amazonaws.com
Cet endpoint (DNS) (-ro-) spécial répartit (load balance) (en mode DNS Round-Robin) automatiquement les connexions (SELECT) entre toutes les Read Replicas (saines) (RR1, RR2, RR3).
3. Custom Endpoints (Aurora Uniquement)
Permet (sur Aurora) de créer vos propres endpoints (ex: analytics-endpoint) et de choisir (manuellement) quelles instances (ex: "uniquement RR2 et RR3") répondent à ce DNS. (Utile pour isoler les workloads BI (lourds) sur des Replicas spécifiques).
2.4. Réseau & Accessibilité (VPC)
Aucun AccĂšs Public (RĂšgle d'Or)
(Bonne Pratique n°1) : Une base de donnĂ©es (RDS) ne doit JAMAIS ĂȘtre accessible depuis Internet. Lors de la crĂ©ation, le paramĂštre Public Access doit toujours ĂȘtre sur No.
Une BDD n'a que une IP Privée.
Placement dans un VPC
L'instance RDS doit "vivre" dans votre VPC (isolée).
- Subnets PrivĂ©s RecommandĂ©s : (Isolation maximale) La BDD doit ĂȘtre placĂ©e dans des Subnets PrivĂ©s (ou "IsolĂ©s") (cĂ d : des Subnets dont la Route Table n'a PAS de route vers un Internet Gateway (IGW)).
- DB Subnet Group : Vous ne "choisissez" pas 1 Subnet, vous "assignez" un DB Subnet Group (ex:
db-subnet-group-private). - (RÚgle HA) : Ce "Subnet Group" doit contenir (au minimum) 2 Subnets Privés, situés dans 2 Availability Zones (AZ) différentes (ex:
private-a (eu-west-3a)etprivate-b (eu-west-3b)).- (Raison : Pour que le "Multi-AZ Failover" (2.3) puisse (physiquement) démarrer le Standby dans l'autre Datacenter (AZ-B)).
Filtrage (SG & NACL)
- NACL (Niveau Subnet) : (Stateless) Laisser (par défaut) (
Allow All). - Security Group (SG) (Niveau Instance) : (Stateful) C'est le vrai pare-feu (le seul Ă configurer).
- (Mauvais) :
Allow TCP/5432 (Postgres)(Source:0.0.0.0/0) -> (DANGEREUX). - (Moyen) :
Allow TCP/5432(Source:10.0.1.0/24(CIDR du Subnet App)) -> (OK, mais trop permissif). - (Meilleur) :
Allow TCP/5432(Source:sg-app-server(L'ID du SG de l'App EC2/Lambda)).
- (Mauvais) :
1.1. Quâest-ce quâAWS RDS ?
RDS (Relational Database Service) est un service PaaS (Platform as a Service). Il vous fournit une base de données relationnelle (SQL) 100% managée (gérée) par AWS.
Vous ne gĂ©rez pas le serveur (EC2), l'OS, ou l'installation de PostgreSQL/MySQL. Vous (Client) restez focalisĂ© sur le schĂ©ma (Tables) et les donnĂ©es (RequĂȘtes SQL).
Automatisation (Ce qu'AWS gĂšre pour vous)
- Provisioning : Création (automatisée) de l'infrastructure (Instance + Stockage).
- Patching (Correctifs) : AWS applique (automatiquement) les patchs de sĂ©curitĂ© (OS) et les mises Ă jour (moteur BDD) (durant une "FenĂȘtre de Maintenance").
- Backups (Sauvegardes) : AWS gĂšre (automatiquement) les Snapshots (quotidiens) et les Logs de Transaction (Point-in-Time Restore (PITR)).
- Réplication (HA) : AWS gÚre (automatiquement) la réplication (Synchrone) vers un "Standby" (dans une autre AZ) via la case à cocher "Multi-AZ".
- Monitoring (Base) : AWS fournit (automatiquement) les métriques (CPU, RAM, IOPS...) à CloudWatch.
Différence : Self-Managed (EC2) vs RDS (Managé)
| Tùche | Self-Managed (BDD sur EC2) | AWS RDS (Managé) |
|---|---|---|
| Installation BDD | Vous (apt install postgresql) | AWS (Automatisé) |
| Patching OS (Sécurité) | Vous (apt update) | AWS (Automatisé) |
Backups (pg_dump) | Vous (cron) | AWS (Automatisé) |
| Haute Disponibilité (HA) | Vous (Setup Standby, Réplication Synchrone) | AWS (Cocher "Multi-AZ") |
| Scaling (Read Replica) | Vous (Setup Réplication Asynchrone) | AWS (Cliquer "Create Read Replica") |
| AccĂšs OS (SSH) | Oui (ContrĂŽle total) | NON (AccĂšs "Golden Cage" / Sauf RDS Custom) |
1.2. Pourquoi choisir RDS ? (Avantages)
1. Gain de Temps (Ops) - "Undifferentiated Heavy Lifting"
L'avantage n°1 est l'économie de temps (et d'argent) sur les opérations (Ops) à faible valeur ajoutée ("undifferentiated heavy lifting").
Au lieu que vos DBAs (Administrateurs BDD) passent 80% de leur temps Ă gĂ©rer les patchs, les pannes de disque, les backups (infra), ils passent 100% de leur temps Ă optimiser ce qui compte : le schĂ©ma (design tables), l'indexation, et le tuning (optimisation) des requĂȘtes SQL lentes (via Performance Insights).
2. Sécurité Intégrée (DÚs le Jour 1)
- Isolation (VPC) : (Bonne Pratique) La BDD est (doit ĂȘtre) lancĂ©e dans un Subnet PrivĂ© (isolĂ©e d'Internet), protĂ©gĂ©e par des Security Groups (pare-feu).
- Chiffrement (Encryption at-Rest) : (Facile) Cochez "Enable Encryption". RDS utilise AWS KMS (votre clé ou une clé AWS) pour chiffrer (automatiquement) le disque (EBS) et les backups.
- Chiffrement (In-Transit) : (Automatique) Force l'utilisation de SSL/TLS (
psql ... sslmode=verify-full) pour les connexions. - Authentification (IAM) : (Moderne) Supporte l'IAM DB Authentication (connexion via Token IAM temporaire, sans mot de passe).
3. Haute Disponibilité (HA) & Scalabilité Simplifiées
- Haute Disponibilité (Multi-AZ) : (Une case à cocher) RDS crée (automatiquement) un "Standby" (clone) synchrone dans une autre AZ (Datacenter). En cas de panne (Master), RDS bascule (failover) (automatiquement, en 30-60s) sur le Standby (qui devient Master).
- Scalabilité Verticale (Vertical Scaling) : (Changement de Taille) Changer une
db.m5.large->db.m5.xlarge(plus de CPU/RAM) (se fait (gĂ©nĂ©ralement) avec un court reboot (downtime minime) lors de la fenĂȘtre de maintenance). - ScalabilitĂ© Horizontale (Horizontal Scaling) : (Lecture) CrĂ©er (en quelques clics) des Read Replicas (RĂ©plicas en lecture) (copies asynchrones) pour dĂ©charger le Master des requĂȘtes
SELECT(BI, Analytics).
1.3. Les Moteurs (Engines) Supportés
RDS supporte les moteurs relationnels (SQL) Open Source et Commerciaux.
| Moteur | Type | Ports (Défaut) | Cas d'usage & Particularités |
|---|---|---|---|
| Amazon Aurora | Cloud-Native (PaaS) | 3306 (MySQL)5432 (Postgres) | (Recommandé AWS) Compatible MySQL/PostgreSQL. Stockage découplé (auto-scalable, 6 copies). Plus rapide (IO) et plus résilient que RDS standard. (Plus cher). |
| PostgreSQL | Open Source | 5432 | (Standard Moderne) TrÚs populaire. Idéal pour Django. Support avancé (JSONB, PostGIS (Géo), Extensions...). |
| MySQL | Open Source | 3306 | (Standard Populaire) TrÚs rapide (lecture), mature, écosystÚme immense (ex: WordPress, LAMP). |
| MariaDB | Open Source (Fork) | 3306 | Alternative (communautaire) Ă MySQL (Oracle). |
| Oracle | Commercial | 1521 | Migration (Lift & Shift) d'applications "Legacy" (anciennes) (ex: ERPs, SAP). (Nécessite "License Included" (trÚs cher) ou "BYOL" (Bring Your Own License)). |
| Microsoft SQL Server | Commercial | 1433 | Migration (Lift & Shift) d'applications Windows / .NET. (Généralement "License Included"). |
1.4. Place de RDS dans lâĂcosystĂšme AWS
RDS est une "brique" (PaaS) centrale qui "vit" (presque toujours) dans votre VPC et interagit avec de nombreux services de sécurité, de monitoring et de calcul.
Interactions (Flux de Données & Gestion)
- VPC (Réseau) : (Fondation) RDS est lancé DANS votre VPC. Il "vit" (pour la sécurité) dans un DB Subnet Group (un ensemble de Subnets Privés).
- EC2 / Lambda (Calcul) : (Consommateurs) Vos applications (EC2/Lambda) (dans le mĂȘme VPC) se connectent Ă l'Endpoint (DNS) privĂ© de RDS (ex:
...rds.amazonaws.com) (via son Security Group). - IAM (Sécurité) : (Permissions) GÚre qui (Admin) a le droit de
CreateDBInstance,DeleteDBInstance. GÚre qui (App) peut s'authentifier (via IAM DB Authentication). - KMS (Chiffrement) : (Sécurité) RDS utilise KMS pour chiffrer (at-rest) (AES-256) le volume EBS sous-jacent (le "disque") et les Snapshots (Backups).
- CloudWatch (Monitoring) : (Observabilité) RDS envoie (pousse) (automatiquement) toutes ses métriques (
CPUUtilization,FreeableMemory,DatabaseConnections...) à CloudWatch (pour Graphes & Alarmes). - AWS Backup / S3 (Sauvegarde) : RDS gÚre (automatiquement) les Snapshots (via AWS Backup / EBS Snapshots) et envoie (automatiquement) les Logs de Transaction (PITR) vers S3 (stockage interne managé).
- Secrets Manager (Secrets) : (Bonne Pratique) Stocke (de maniÚre sécurisée/chiffrée) le Master Username/Password de RDS, et gÚre la rotation (changement) automatique du mot de passe.
RDS (Relational Database Service) est un service PaaS (Platform as a Service). Vous ne gérez pas le serveur (EC2), l'OS, ou l'installation de PostgreSQL/MySQL.
Vous demandez "Je veux une BDD Postgres 15.3 (Large, 100GB)", AWS s'occupe de tout le reste.
RDS (Managé) vs BDD sur EC2 (Non-Managé)
| TĂąche | BDD sur EC2 (IaaS) | AWS RDS (PaaS) |
|---|---|---|
| Installation BDD | Vous (apt install postgresql) | AWS (Automatisé) |
| Patching OS (Sécurité) | Vous (apt update) | AWS (Durant la Maintenance Window) |
| Patching Moteur (Mineur) | Vous (Upgrade 15.3 -> 15.4) | AWS (Durant la Maintenance Window) |
| Backups (Snapshots) | Vous (cron, pg_dump) | AWS (Automatisé, nuit) |
| Haute Disponibilité (HA) | Vous (Setup Standby, Réplication Synchrone) | AWS (Cocher la case "Multi-AZ") (3.1) |
| Scaling (Lecture) | Vous (Setup Read Replica, Réplication Asynchrone) | AWS (Cliquer "Create Read Replica") (3.2) |
| Scaling (CPU/RAM) | Stop EC2 -> Resize -> Start EC2 (Downtime) | Modifier Instance -> Apply (Downtime minime) |
| AccĂšs OS (SSH) | Oui (AccĂšs Root total) | NON (AccĂšs impossible. Sauf RDS Custom (7.3)) |
RDS supporte les moteurs relationnels standards (Open Source et Commerciaux).
Moteurs Open Source (Populaires)
- PostgreSQL : (Recommandé) TrÚs populaire, support JSONB, PostGIS, extensions. (Port
5432). - MySQL : (Populaire) Standard (LAMP), trĂšs rapide pour la lecture simple. (Port
3306). - MariaDB : Fork (Open Source) de MySQL. (Port
3306).
Moteurs Commerciaux (Licence)
- Oracle : (Nécessite Licence "BYOL" ou "License Included"). (Port
1521). - Microsoft SQL Server : (License Included). (Port
1433).
Le Moteur "Cloud-Native" : AWS Aurora
Aurora n'est pas un moteur. C'est une "couche de stockage" (backend) custom (inspirée de S3) compatible (frontend) avec MySQL ou PostgreSQL.
- Avantages : Plus rapide (IO), stockage auto-scalable (jusqu'Ă 128TB), Backups continus, Read Replicas (15) plus rapides.
- Inconvénient : Plus cher (que RDS standard), "Lock-in" AWS (format de stockage propriétaire).
Comme pour EC2, vous choisissez le "Hardware" (CPU/RAM) de votre BDD. La nomenclature commence par db. (au lieu de m5.).
Familles (Nomenclature : db.r6g.large)
db.: Préfixe RDS.r: Famille (Optimisée RAM). (Recommandé pour BDD).m: Famille (Multi-usage / General).t: Famille (T Burstable). (OK pour Dev/Test, JAMAIS pour Prod).6: Génération (6Úme). (Plus haut = Mieux/Moins cher).g: Processeur (g = Graviton (ARM, moins cher)). (i= Intel,a= AMD).large: Taille (CPU/RAM).
Le PiĂšge (Burstable db.tX)
Les instances db.t3.micro (Free Tier) ou db.t4g.small fonctionnent avec des Crédits CPU (comme EC2).
Une BDD (Prod) a besoin de 100% CPU soutenu (pas de "burst"). Si une instance db.tX (Prod) tombe à 0 crédits, la BDD va "throttler" (ralentir massivement) et l'application va planter (Timeouts).
Bonne Pratique (Prod) : Toujours utiliser des familles Fixes (db.r... ou db.m...) pour la production.
C'est la premiÚre étape de l'assistant ("Create database") dans la console RDS.
Standard Create vs Easy Create
Toujours choisir Standard Create (pour avoir le contrÎle total, notamment du Réseau (2.2)).
Engine Options
- Engine type : Ex:
PostgreSQL. - Version : Ex:
PostgreSQL 15.3-R1. (Toujours choisir la derniÚre version stable supportée).
Templates (ModĂšles)
- Production : (Défaut) Active Multi-AZ (HA), Stockage IOPS Provisioned. (Cher).
- Dev/Test : (Défaut) Single-AZ (pas de HA), Stockage gp3. (Moins cher).
- Free Tier : (Défaut)
db.tX.micro, 20GB. (Pour tester).
Settings (Configuration)
- DB instance identifier : Le "nom" de la BDD (ex:
mon-app-prod). - Master username : L'utilisateur "Super Admin" (ex:
postgres,admin). (Note : Ce n'est pas un vrai "SuperUser", RDS garde certaines permissions). - Master password : Le mot de passe. (Bonne Pratique : Laisser "Auto-generate" et stocker dans Secrets Manager (6.3)).
(Section la plus critique) C'est ici que 90% des débutants échouent à se connecter (Timeouts).
Une BDD RDS (non-Publique) "vit" à l'intérieur de votre VPC (Réseau Privé).
Configuration Réseau
- Virtual Private Cloud (VPC) : Choisir le VPC oĂč "vit" votre application (EC2, Lambda). (ex:
vpc-main). - DB Subnet Group : (Concept Clé) Vous ne choisissez pas 1 Subnet, mais un "Groupe" (ex:
db-subnet-group-private).- (Un Subnet Group doit contenir au moins 2 Subnets Privés, dans 2 AZs différentes).
- (Raison : Si vous activez Multi-AZ (3.1), AWS a besoin d'un Subnet (dans une AZ-b) pour y placer le Standby).
- Public Access :
No(NON). (Bonne Pratique).- (Si
Yes, la BDD reçoit une IP Publique. C'est une faille de sécurité majeure). - (Si
No, la BDD n'a que une IP Privée (ex:10.0.30.50) et est inaccessible depuis Internet).
- (Si
(ProblÚme) : Si ma BDD est 100% privée (Public Access: No), comment mon App (EC2) s'y connecte ?
(Solution) : Via le Security Group (2.3).
(PiÚge n°1 de Connexion) Le Security Group (SG) est le pare-feu (Stateful) de la BDD. Par défaut, il bloque TOUT (Deny All).
Si vous ne configurez rien, votre App (Django) tentera de se connecter (au Port 5432) et recevra un Connection Timeout (le pare-feu a "drop" le paquet).
Configuration (Bonne Pratique)
Vous avez (généralement) 2 SGs :
sg-app(Attaché à vos EC2/Lambda Django).sg-db(Attaché à votre Instance RDS).
Vous devez modifier le sg-db (le pare-feu de la BDD) et ajouter 1 RĂšgle Inbound (Entrante) :
| Type | Protocole | Port | Source | Description |
|---|---|---|---|---|
| PostgreSQL (ou MySQL) | TCP | 5432 (ou 3306) | sg-app (ID du SG) | (Autorise l'App Ă parler Ă la BDD). |
Ce qu'il ne faut PAS faire
- (Source =
0.0.0.0/0) : Ouvre votre BDD Ă tout Internet. (Faille majeure). - (Source =
Mon IP (80.1.2.3/32)) : Autorise votre PC (Admin), mais pas votre App (EC2/Lambda) (qui a une autre IP).
RĂšgle : La "Source" doit ĂȘtre l'ID (sg-12345...) du Security Group de l'Application.
C'est la fonctionnalité (case à cocher "Production") pour la Haute Disponibilité (Tolérance aux pannes).
(Ne pas confondre avec Read Replica (3.2) qui est pour le Scaling).
Fonctionnement (Automatique)
- (AWS) Crée un Standby (Clone exact) dans une autre AZ (ex: AZ-b).
- (AWS) Configure une réplication Synchrone (
Master (AZ-a) -> Standby (AZ-b)). - (Client) Votre App (Django) ne voit que 1 Endpoint DNS (
...rds.amazonaws.com) (qui pointe vers le Master). - (Flux Ăcriture)
COMMIT;-> (Master) Ăcrit Disque (AZ-a) -> Envoie au Standby -> (Standby) Ăcrit Disque (AZ-b) -> (Standby) OK -> (Master) OK -> Renvoie "OK" au Client.- (LĂ©gĂšre augmentation de la latence en Ă©criture, car double Ă©criture).
Scénario de Panne (Failover)
- (Panne) L'instance Master (AZ-a) tombe (Hardware, OS, etc.).
- (RDS) Détecte la panne (Health Check).
- (RDS) (Automatique) Fait un "Failover" :
- Promeut le Standby (AZ-b) en nouveau Master.
- Change (bascule) l'Endpoint DNS (
...rds.amazonaws.com) pour pointer vers l'IP (privée) du nouveau Master (AZ-b).
RĂ©sultat : Downtime de 30-60 secondes (le temps du basculement DNS/Promotion). (L'application (Django) voit un "timeout" puis se reconnecte (automatiquement) au mĂȘme Endpoint DNS (qui pointe maintenant ailleurs)).
C'est la fonctionnalité (manuelle) pour le Scaling en Lecture (Performance).
ProblĂšme (App "Read-Heavy")
Mon App (Blog) a 99% de SELECT (lecture) et 1% de INSERT (écriture). Le Master (CPU 100%) n'arrive plus à suivre les SELECT.
Solution : Read Replica (RR)
- (Manuel) Clic "Create Read Replica" (sur le Master).
- (AWS) CrĂ©e une nouvelle instance BDD (copie lecture seule) (peut ĂȘtre dans la mĂȘme RĂ©gion, ou Cross-Region (ex: USA)).
- (AWS) Configure une réplication Asynchrone (
Master -> RR). - (AWS) Vous donne un nouvel Endpoint DNS (
...rr.rds.amazonaws.com).
Implémentation (Applicative)
Vous devez modifier votre Code Applicatif (ex: Django) pour :
- Envoyer toutes les Ăcritures (
INSERT, UPDATE, DELETE) vers l'Endpoint Master. - Envoyer tous (ou 90%) les
SELECT(coûteux) vers l'Endpoint Read Replica (RR).
Résultat : Le Master (CPU 10%) ne gÚre que les écritures. Le RR (CPU 90%) gÚre toutes les lectures.
PiÚge (Asynchrone) : Si vous écrivez (INSERT) (Master) et lisez (SELECT) (RR) immédiatement, le SELECT peut ne pas voir la donnée (Lag de réplication de 50ms). (Ne pas utiliser RR pour des lectures "critiques" post-écriture).
C'est le monitoring de base (gratuit), activé par défaut. Il mesure l'Hyperviseur (la "boßte" RDS).
Granularité : 5 minutes (par défaut) ou 1 minute (si activé).
Métriques Clés à Surveiller (et Alarmer)
| Métrique | Signification | Action (Alarme) |
|---|---|---|
CPUUtilization | Utilisation CPU (%). | Alarme si > 80% (pendant 15 min) -> (Action: Investiguer (4.3) ou Scaler (Upgrade instance (1.3))). |
DatabaseConnections | Nombre de connexions TCP actives. | Alarme si > 80% (de max_connections) -> (Action: Investiguer (App leak?) ou utiliser RDS Proxy (7.1)). |
FreeableMemory | RAM (OS) disponible (en Bytes). | Alarme si < 100MB -> (Action: Risque OOM (Out of Memory). Scaler (Upgrade RAM)). |
FreeStorageSpace | Espace Disque (EBS) libre (en Bytes). | Alarme si < 10GB -> (Action: Risque DB "Read-Only". Augmenter Stockage (3.3)). |
Read/WriteIOPS | IOPS Disque (utilisés). | Alarme si ReadLatency > 10ms -> (Action: Disque saturé. Augmenter IOPS (gp3/io1)). |
ReplicaLag | (Pour Read Replica (3.2)) Retard (en secondes) vs Master. | Alarme si > 60 sec -> (Action: Risque données obsolÚtes. Investiguer (IO/Réseau)). |
C'est le monitoring optionnel (payant) qui mesure l'OS (SystĂšme d'Exploitation) sous-jacent (Linux/Windows).
CloudWatch (4.1) dit "CPU = 80%". Enhanced Monitoring (EM) dit "CPU = 80% car le process postgres:_vacuum utilise 50% et postgres:__select 30%".
Activation & Coût
- Activation : Case Ă cocher ("Enable Enhanced Monitoring").
- Granularité (Haute Résolution) : 1, 5, 10, 15, 30, ou 60 secondes.
- Fonctionnement : AWS installe un Agent (sur l'hÎte RDS) qui envoie les métriques (JSON) vers CloudWatch Logs.
- Coût : Payant (Facturé à l'ingestion/stockage CloudWatch Logs).
Métriques Clés (disponibles dans EM)
loadAverageMinute(load_1, load_5, load_15) : (La "vraie" charge CPU).tasks(running, sleeping, blocked) : Nb de process en attente.memory(active, free, buffers, cached) : Utilisation détaillée de la RAM (vsFreeableMemory(4.1) qui est basique).cpuUtilization(guest, irq, nice, system, user, wait) : (wait= % CPU en attente d'IO Disque).processList: Le "Top" (htop) de l'OS (PID, User, %CPU, %MEM, Commande).
Usage : Quand CloudWatch (4.1) est "dans le rouge", on active EM (ex: 1 sec) pour voir quel process OS (ex: vacuum, log_writer) cause le problĂšme.
C'est le monitoring le plus puissant (gratuit 7 jours). Il mesure la BDD (le Moteur), pas l'OS ni l'Hyperviseur.
Objectif : RĂ©pondre Ă "Pourquoi ma BDD est lente ? Quelle requĂȘte SQL (Query) est la coupable ?".
La Métrique Clé : "Database Load (AAS)"
Performance Insights (PI) n'utilise pas le CPU. Il utilise l'AAS (Average Active Sessions) (Sessions Actives Moyennes).
C'est le nombre de connexions (sessions) qui sont soit en train d'utiliser le CPU, soit en train d'attendre (Wait) (ex: attendre un Lock, attendre le Disque).
Si votre "Max vCPU" (ligne pointillée) est à 4, et que votre "AAS" (graphique) est à 10 -> Votre BDD est en surcharge (6 sessions sont en attente).
Le Dashboard (Diagnostic)
Le dashboard "Top SQL" affiche la charge (AAS) répartie par :
- 1. Wait Events (Attentes) : (La couleur du graphique)
CPU(Vert) : La requĂȘte utilise le CPU (Normal).IO:XactSync(Bleu) : (Postgres) Attend l'Ă©criture (COMMIT) sur le disque (IOPS ?).IO:DataFileRead(Bleu) : Attend la lecture (SELECT) sur le disque (Index manquant ?).Lock:transactionid(Rouge) : Attend qu'un autreUPDATE(verrou) se termine.
- 2. SQL (Top Queries) :
- (Liste)
SELECT * FROM users WHERE email = ?(Charge : 4.5 AAS) (Coupable n°1). - (Liste)
UPDATE stock...(Charge : 2.1 AAS) (Coupable n°2).
- (Liste)
Usage : (Diagnostic en 30 sec) 1. Regarder PI -> 2. Voir AAS = 10 (Surcharge) -> 3. Voir "Top SQL" = SELECT * FROM users... -> 4. Voir "Wait Event" = IO:DataFileRead (Bleu) -> 5. (Conclusion) "Le SELECT * FROM users (coupable) est lent car il attend le disque (Wait IO)". -> 6. (Action) "Ajouter un Index (CREATE INDEX) sur la colonne email".
(Restauration à la Seconde) C'est la fonctionnalité de restauration la plus puissante, activée grùce aux Backups Automatiques (5.1).
Pré-requis (Ce que fait AWS)
- (Nuit) AWS prend 1 Snapshot (Backup) quotidien (ex: à 02:00 UTC). (Garde 7 jours (défaut)).
- (Continu) AWS capture (en temps réel) tous les Logs de Transaction (TX Logs) (
INSERT,UPDATE,DELETE) et les envoie (toutes les 5 min) sur S3 (stockage interne).
Scénario (Erreur Humaine)
Mardi 14:32:10 -> Un développeur (Stagiaire) lance DELETE FROM users; (oups) (sans WHERE).
Mardi 14:33:00 -> Panique.
Restauration (PITR)
- (Admin) Console RDS -> "Restore to point in time".
- (Admin) Choisit "Custom". Date/Heure : Mardi 14:32:05 (5 secondes avant le
DELETE). - (Admin) Donne un Nouveau Nom (ex:
mon-app-prod-restored). - (AWS) Lance la restauration (automatique) :
- (AWS) RécupÚre le dernier Snapshot (celui de 02:00 UTC).
- (AWS) Crée une nouvelle BDD (
-restored) à partir de ce Snapshot (état 02:00). - (AWS) RécupÚre tous les Logs de Transaction (TX Logs) (stockés sur S3) de 02:00:00 à 14:32:05.
- (AWS) "Rejoue" (Replay) (en accéléré) ces 12h de logs sur la nouvelle BDD.
Résultat : (AprÚs 30 min) Une nouvelle instance BDD (mon-app-prod-restored) est disponible, contenant les données exactes à 14:32:05 (juste avant le drame).
Note : PITR crée toujours une nouvelle instance. (Il n'écrase jamais la BDD (cassée) d'origine).
1. Pré-requis (Driver Python)
Django (Python) a besoin d'un "driver" (librairie) pour parler au moteur RDS.
# (Dans votre venv / requirements.txt)
# Pour PostgreSQL (Recommandé)
pip install psycopg2-binary
# Pour MySQL
pip install mysqlclient
2. Mauvaise Pratique (Hardcodé dans settings.py)
Ne jamais mettre de mots de passe (secrets) dans le code (Git).
# (NE PAS FAIRE)
# mon_app/settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'ma_bdd_prod',
'USER': 'postgres_admin',
'PASSWORD': 'Password12345!', # (FAILLE DE SĂCURITĂ)
'HOST': 'mon-app-prod.abcdef123.eu-west-3.rds.amazonaws.com', # (Endpoint RDS)
'PORT': '5432',
}
}
3. Bonne Pratique (AWS Secrets Manager + IAM Role)
Flux : 1. Stocker les secrets (JSON) dans "Secrets Manager". 2. Donner un IAM Role (à l'EC2/Lambda) pour lire ce secret. 3. Le code (Boto3) récupÚre le secret au démarrage (runtime).
Pré-requis : pip install boto3
# (BONNE PRATIQUE)
# mon_app/settings.py
import boto3
import json
# 1. Récupérer le nom du Secret (via Variable d'Environnement)
SECRET_ID = os.environ.get('DB_SECRET_ARN') # (ex: "arn:aws:secrets...")
# 2. (Boto3) Appeler l'API AWS
client = boto3.client('secretsmanager', region_name='eu-west-3')
response = client.get_secret_value(SecretId=SECRET_ID)
secret = json.loads(response['SecretString'])
# 3. (Django) Utiliser les secrets (récupérés)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': secret.get('dbname'),
'USER': secret.get('username'),
'PASSWORD': secret.get('password'), # (Jamais stocké dans Git)
'HOST': secret.get('host'), # (Endpoint RDS)
'PORT': secret.get('port'),
}
}
Résultat : Zéro secret dans le code. 100% sécurisé (via IAM Role).
RDS utilise des volumes EBS (gp3 ou io1/io2) pour le stockage. gp3 est le standard (bon rapport prix/perf, IOPS de base 3000). io1/io2 sont pour les workloads (OLTP) extrĂȘmes (IOPS garantis, plus chers). Storage Autoscaling (option) permet Ă AWS d'augmenter la taille du disque automatiquement si FreeStorageSpace (4.1) devient trop bas, Ă©vitant une panne (DB Read-Only).
RDS gĂšre deux types de snapshots (basĂ©s sur EBS). 1. Automated Backups : (ActivĂ© par dĂ©faut) Pris 1x/jour (fenĂȘtre de 30min) + capture des Logs de Transaction (5.2). RĂ©tention (1-35 jours). SupprimĂ©s si la BDD est supprimĂ©e. 2. Manual Snapshots : Pris manuellement (via API/Clic). GardĂ©s mĂȘme si la BDD est supprimĂ©e (utile pour archivage long terme avant suppression).
Puisque RDS est un service managĂ© (1.1), AWS doit patcher l'OS et le moteur (sĂ©curitĂ©, bugs). Vous dĂ©finissez une "FenĂȘtre de Maintenance" (ex: Dimanche, 03:00-03:30). Si un patch (mineur) est requis, AWS l'appliquera (automatiquement) durant cette fenĂȘtre. Si la BDD est Multi-AZ (3.1), AWS patche le Standby d'abord, fait un Failover, puis patche l'ancien Master (Downtime minimal).
Alternative (moderne) à la gestion des mots de passe (Master User (2.1) ou Secrets (6.3)). Activation : Cochez "IAM DB Authentication". Flux : (User/App) 1. L'User (avec policy IAM rds-db:connect) génÚre un Token d'Auth temporaire (valide 15 min) via l'API RDS (generate-db-auth-token). 2. L'User utilise ce Token comme mot de passe (via psql/mysql client) pour se connecter à la BDD. Avantages : Plus de mots de passe (statiques) à gérer/roter. Audit centralisé (CloudTrail).
RDS chiffre (At-Rest) tout : le Stockage (EBS), les Snapshots, les Read Replicas. Clé par Défaut (aws/rds) : AWS utilise une clé gérée par AWS (transparente). Clé Client (CMK) : (Bonne Pratique Compliance) Vous pouvez spécifier votre propre Clé KMS. Avantages : Vous contrÎlez la clé (Key Policy), vous pouvez la roter, et (surtout) vous pouvez voir (via CloudTrail) si quelqu'un (ex: un Snapshot exporté) utilise la clé (Audit).
ProblĂšme (Serverless/Lambda) : Les BDD (Postgres/MySQL) ont une limite de connexions (ex: 1000). 1000 Lambdas (concurrents) = 1000 connexions = Ăpuisement (Erreur "Too many connections"). Solution (RDS Proxy) : C'est un "pooler" de connexion managĂ© (PaaS) (comme PgBouncer). Flux : (1000 Lambdas) se connectent au Proxy (Endpoint du Proxy). (Proxy) ouvre (ex:) 10 connexions (pool) au RDS. (Proxy) partage (multiplexe) ces 10 connexions (rĂ©elles) entre les 1000 requĂȘtes (Lambda). Avantages : Ăvite l'Ă©puisement. GĂšre le Failover (3.1) plus rapidement (cache DNS).
C'est la version "Cloud-Native" (Aurora) de RDS (1.2), en mode "Serverless". ProblĂšme (RDS Standard) : Vous payez (ex:) db.r6g.large (16GB RAM) 24/7, mĂȘme si la BDD est idle (0%) la nuit. Solution (Serverless v2) : Vous dĂ©finissez un Min/Max (ex: 0.5 RCU (1GB) Ă 16 RCU (32GB)). Flux : (Nuit) BDD idle -> AWS scale (automatiquement) Ă 0.5 RCU (CoĂ»t minime). (Matin) Pic de charge -> AWS scale (automatiquement, sans downtime) Ă 16 RCU. Usage : IdĂ©al pour Dev/Test, ou applications SaaS (multi-tenant) avec charge imprĂ©visible.
C'est un hybride entre RDS (1.1) et EC2. ProblÚme (RDS Standard) : Je ne peux pas (via SSH) installer un "patch" custom (non-AWS) ou modifier postgresql.conf (paramÚtres avancés). Solution (RDS Custom) : AWS provisionne RDS sur une EC2 dédiée (dans votre compte). Vous avez accÚs SSH/SSM (Root) à l'EC2 sous-jacente. Inconvénients : Vous devenez (partiellement) responsable du patching OS. La HA (Multi-AZ) est plus complexe. Usage : Applications "Legacy" (ex: Oracle, SQL Server) qui nécessitent des patchs spécifiques non-standards.
Voici les ressources officielles d'AWS pour approfondir vos connaissances sur RDS.
| Ressource | Description | Lien (URL) |
|---|---|---|
| Page Produit RDS | Présentation marketing et fonctionnelle du service. | https://aws.amazon.com/rds/ |
| Tarification RDS | Détail des coûts (Instances, Stockage, IOPS, Data Transfer). | https://aws.amazon.com/rds/pricing/ |
| Guide Utilisateur (Doc) | La documentation technique complĂšte (le "Developer Guide"). | https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/ |
| Spécificités PostgreSQL | Documentation spécifique à l'utilisation de RDS avec PostgreSQL. | https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_PostgreSQL.html |
| Performance Insights | Documentation sur l'outil de monitoring SQL (AAS, Wait Events). | https://aws.amazon.com/rds/performance-insights/ |
| Bonnes Pratiques (Blog) | Articles de blog AWS sur les "Best Practices" RDS. | https://aws.amazon.com/blogs/database/category/database/amazon-rds/ |
Au-delĂ du CPU/RAM (CloudWatch), le monitoring de PostgreSQL se concentre sur les transactions (TXID), le "nettoyage" (VACUUM) et les connexions.
Alerte Critique : Transaction ID (TXID) Wraparound
PostgreSQL utilise un compteur (32-bit, ~4 milliards) pour les transactions. S'il atteint la fin (wraparound) sans ĂȘtre "nettoyĂ©" (VACUUM), la base s'arrĂȘte (STOP) en mode "lecture seule" pour Ă©viter la corruption de donnĂ©es.
RDS gĂšre cela (automatiquement) via Autovacuum, mais il peut ĂȘtre bloquĂ©.
Métriques CloudWatch à Alarmer :
MaximumUsedTransactionIDs: (Métrique la plus importante) Le nombre de TXID utilisés.- Alarme (Critique) si > 1 000 000 000 (1 Milliard).
TransactionLogsDiskUsage: Espace disque utilisé par les logs de transaction (WAL).
Si MaximumUsedTransactionIDs monte, cela signifie que autovacuum est bloquĂ© (souvent par une requĂȘte SELECT trĂšs longue) et ne peut pas "geler" (nettoyer) les anciennes transactions.
Suivi du "Bloat" (Ballonnement) et VACUUM
Quand vous faites un UPDATE ou DELETE sur Postgres, l'ancienne ligne n'est pas supprimée, elle est marquée "morte" (dead tuple). Le VACUUM est le "nettoyeur de M." (garbage collector) qui libÚre cet espace.
Si autovacuum est trop lent (ou bloqué), la table "gonfle" (Bloat), et les SELECT deviennent lents (car ils doivent lire des millions de lignes "mortes").
Outils de diagnostic :
- Enhanced Monitoring (4.2) : Permet de voir (via
processList) si les processautovacuum workersont actifs et s'ils consomment du CPU/IO. - Performance Insights (4.3) : Permet de voir si
autovacuumest en attente (Wait Event) à cause d'unLock(verrou) posé par une autre session.
RequĂȘtes SQL Utiles (via psql)
Pour un diagnostic avancĂ©, connectez-vous (via psql, DBeaver, etc.) en tant que postgres (Master User) et lancez ces requĂȘtes.
1. Voir les requĂȘtes longues / bloquantes (pg_stat_activity)
SELECT
pid,
age(clock_timestamp(), query_start) AS duration,
state,
wait_event,
query
FROM pg_stat_activity
WHERE state != 'idle' AND query NOT LIKE '%pg_stat_activity%'
ORDER BY duration DESC
LIMIT 10;
2. Estimer le "Bloat" (Dead Tuples)
SELECT
relname AS table_name,
n_live_tup,
n_dead_tup,
(n_dead_tup * 100 / (n_live_tup + n_dead_tup)) AS dead_percent
FROM pg_stat_user_tables
WHERE (n_live_tup + n_dead_tup) > 0
ORDER BY dead_percent DESC
LIMIT 10;
La tarification RDS est multi-dimensionnelle. Comprendre les 5 piliers est essentiel pour éviter les surprises (FinOps).
Les 5 Piliers de Facturation RDS
| Pilier | Description | Unité |
|---|---|---|
| 1. Instance (Calcul) | Le CPU/RAM (ex: db.r6g.large). (Si Multi-AZ (3.1), vous payez x2 instances). | $/Heure (On-Demand) |
| 2. Stockage (EBS) | Le disque (ex: 100 GB gp3). | $/GB/Mois |
3. IOPS (si io1/io2) | Si vous utilisez du stockage io1/io2 (IOPS Provisionnés). (gp3 inclut 3000 IOPS). | $/IOPS/Mois |
| 4. Stockage Backups | Stockage (sur S3) des Snapshots (5.1) et Logs (5.2). (Le stockage équivalent à 100% de votre BDD (ex: 100GB) est Gratuit. Vous payez l'excédent). | $/GB/Mois (Tarif S3) |
| 5. Data Transfer | Trafic réseau sortant vers Internet (Egress). (Trafic Entrant (Ingress) = Gratuit). (Trafic Inter-AZ (pour Multi-AZ) = Gratuit). | $/GB (Sortie) |
Stratégies d'Optimisation (FinOps)
- Reserved Instances (RI) : (Pour la Prod) S'engager (1 ou 3 ans) sur une instance (ex:
db.r6g.large) pour une réduction de -30% à -60% (vs On-Demand). - Graviton (ARM) : (Pour la Prod) Utiliser des instances
db.r6g(Graviton/ARM) au lieu dedb.r5(Intel/x86). (Meilleur rapport prix/performance). - Stop/Start (Dev/Test) : (Pour Dev/Test) Scripter (Lambda/EventBridge) l'arrĂȘt (
StopDBInstance) des BDD de Dev le soir (19h) et le weekend. (Le stockage (Pilier 2) continue d'ĂȘtre facturĂ©, mais le Calcul (Pilier 1) est stoppĂ©). - Aurora Serverless v2 (7.2) : (Pour Dev/Test) Utiliser Serverless v2 qui "scale-to-zero" (presque) quand inutilisĂ© (pay-per-second).
- S3 Bucket Key (4.3) : (Pour SSE-KMS) Activer cette option pour réduire drastiquement les coûts d'appels à l'API KMS.
