Documentation de l'Infrastructure AWS : beezyup-prod-c01
1. Vue d'ensemble
Ce document décrit l'architecture cloud de l'environnement beezyup-prod-c01, entièrement gérée via AWS CloudFormation. L'infrastructure est conçue pour être sécurisée, scalable et hautement disponible en s'appuyant sur plusieurs zones de disponibilité (Multi-AZ).
L'architecture s'articule autour des services AWS suivants :
- Réseau : Amazon VPC pour l'isolation réseau.
- Conteneurs : Amazon ECS (Elastic Container Service) avec un mix de Capacity Providers (EC2 Spot) pour l'orchestration des conteneurs applicatifs.
- Exposition & Routage : CloudFront, API Gateway et un Network Load Balancer (NLB) pour exposer l'API de manière sécurisée et performante.
- Stockage : Deux buckets Amazon S3 distincts pour les médias publics et les fichiers privés, chacun servi par une distribution CloudFront dédiée.
- Cache : Amazon ElastiCache Serverless (Valkey) pour le cache de l'application.
- Sécurité : IAM pour la gestion des permissions, Security Groups pour le filtrage réseau, et VPC Endpoints pour sécuriser la communication avec les services AWS.
2. Schéma d'Architecture
graph TD
subgraph Internet
Utilisateur[Utilisateur Final]
end
subgraph "AWS Cloud (Edge)"
CF_API[CloudFront <br> api.beezyup.com]
CF_Media[CloudFront <br> media.beezyup.com]
CF_Files[CloudFront <br> files.beezyup.com]
end
subgraph "AWS Région (VPC: 10.0.0.0/16)"
APIGW[API Gateway <br> Authorizer JWT Supabase <br> Rate Limiting]
NLB[Internal Network Load Balancer]
subgraph "Private Subnets (Multi-AZ)"
ECS[ECS Service <br> Tâches de l'API Laravel]
Cache[ElastiCache Serverless <br> (Valkey/Redis)]
SecretsEP[VPC Endpoint <br> Secrets Manager]
S3EP[VPC Endpoint <br> S3]
end
subgraph "Public Subnets (Multi-AZ)"
NAT[NAT Gateway]
end
S3_Public[S3 Bucket <br> beezyup-prod-public-media]
S3_Private[S3 Bucket <br> beezyup-prod-private-files]
end
Utilisateur -- HTTPS --> CF_API
Utilisateur -- HTTPS --> CF_Media
Utilisateur -- HTTPS/Signed URL --> CF_Files
CF_API -- HTTPS --> APIGW
APIGW -- VPC Link --> NLB
NLB -- TCP --> ECS
CF_Media -- OAC --> S3_Public
CF_Files -- OAC --> S3_Private
ECS -- TCP --> Cache
ECS -- via S3EP --> S3_Public & S3_Private
ECS -- via SecretsEP --> Secrets Manager
ECS -- via NAT --> Internet[Accès Internet sortant]

3. Description Détaillée des Composants
3.1. Réseau (nested/network.yaml)
Le réseau est la fondation de l'infrastructure.
- VPC : Un Virtual Private Cloud est créé avec le CIDR
10.0.0.0/16pour isoler logiquement toutes les ressources. - Sous-réseaux (Subnets) :
- Publics : Deux subnets publics, répartis sur deux zones de disponibilité (
eu-west-3a,eu-west-3b). Ils hébergent la NAT Gateway et permettent un accès à Internet. - Privés : Deux subnets privés, également en Multi-AZ. C'est ici que se trouvent les ressources critiques qui ne doivent pas être exposées directement sur Internet : les tâches ECS, le NLB et le cache ElastiCache.
- Publics : Deux subnets publics, répartis sur deux zones de disponibilité (
- NAT Gateway : Permet aux ressources dans les subnets privés (comme les conteneurs ECS) d'initier des connexions vers Internet (ex: pour appeler des API externes ou télécharger des dépendances) sans autoriser de connexions entrantes.
3.2. Conteneurs et Orchestration (ECS)
- Cluster ECS (
nested/ecs-cluster.yaml) : Un cluster logique nommébeezyup-prod-c01qui gère les services et les tâches. Il est configuré pour utiliser un Capacity Provider EC2, ce qui permet de faire tourner les conteneurs sur des instances EC2 Spot pour optimiser les coûts. - Auto Scaling Group & Launch Template : Le Capacity Provider est adossé à un Auto Scaling Group qui gère un parc d'instances EC2 de type
t3.large. Ces instances sont configurées via un Launch Template pour utiliser l'AMI optimisée pour ECS et rejoindre le cluster au démarrage. Le scaling est géré par ECS (TargetCapacity: 75%). - Service ECS (
ecs-service-beezyup.txt) : Le service est responsable de maintenir le nombre désiré de tâches applicatives en cours d'exécution. Il est configuré pour s'enregistrer auprès du Network Load Balancer afin de recevoir du trafic.
3.3. Exposition et Routage de l'API
Le chemin d'une requête API est une chaîne de services conçue pour la sécurité et la performance.
-
CloudFront (
nested/api-cloudfront.yaml) :- Point d'entrée public pour
api.beezyup.com. - Terminaison SSL : Gère le chiffrement HTTPS avec un certificat ACM.
- Cache : Une politique de cache spécifique (
CachingOptimized) est appliquée sur le chemin/leads/*pour accélérer les réponses des requêtes GET. Les autres chemins ne sont pas mis en cache (CachingDisabled). - Sécurité : Agit comme une première ligne de défense contre les attaques DDoS.
- Point d'entrée public pour
-
API Gateway (
nested/api-gateway.yaml) :- Authentification : Un Authorizer JWT est configuré pour valider les tokens d'authentification émis par Supabase avant de laisser passer la requête.
- Contrôle d'accès : Gère les permissions CORS pour les frontends web.
- Limitation de débit (Throttling) : Protège le backend contre les abus avec des limites de requêtes par seconde.
- VPC Link : Connecte de manière sécurisée l'API Gateway (service public) à notre Network Load Balancer interne (ressource privée) sans passer par l'Internet public.
-
Network Load Balancer (NLB) (
nested/nlb.yaml) :- Interne : Le NLB est
internal, ce qui signifie qu'il n'a pas d'adresse IP publique et n'est accessible que depuis le VPC. - Haute Performance : Il opère au niveau 4 (TCP) et distribue le trafic de manière très efficace vers les adresses IP des tâches ECS enregistrées.
- Interne : Le NLB est
3.4. Stockage de Fichiers (S3)
L'infrastructure distingue clairement les fichiers publics des fichiers privés.
Médias Publics (Avatars, images de leads)
- Bucket S3 (
nested/s3-media-public.yaml) : Le bucketbeezyup-prod-public-mediaest 100% privé. L'accès public est bloqué. - CloudFront (
nested/cloudfront-s3-media.yaml) : La distributionmedia.beezyup.comest le seul moyen d'accéder aux objets de ce bucket. - Sécurité : La connexion entre CloudFront et S3 est sécurisée via Origin Access Control (OAC), la méthode moderne et recommandée par AWS.
- IAM User : Un utilisateur IAM dédié est créé avec des permissions strictes (
s3:PutObject,s3:DeleteObject) pour permettre à l'application de téléverser des fichiers.
Fichiers Privés (Factures, documents d'identité)
- Bucket S3 (
nested/s3-files-private.yaml) : Le bucketbeezyup-prod-private-filesest également 100% privé. - CloudFront (
nested/cloudfront-s3-files.yaml) : La distributionfiles.beezyup.comest configurée pour exiger des URLs signées. - Sécurité des URLs Signées : Seules les requêtes contenant une signature cryptographique valide, générée par le backend applicatif pour un utilisateur authentifié et pour une durée limitée, sont autorisées. Ceci est appliqué via un
TrustedKeyGroups.
3.5. Cache (nested/elasticache-serverless.yaml)
- ElastiCache Serverless : Fournit un cache en mémoire compatible Valkey/Redis.
- Objectif : Utilisé par l'application Laravel pour stocker des sessions, des résultats de requêtes complexes et d'autres données fréquemment consultées, réduisant ainsi la charge sur la base de données et améliorant la latence.
- Sécurité & Contrôle des Coûts : Le cache est déployé dans les subnets privés et n'est accessible que par les tâches ECS. Des limites de stockage (
DataStorageLimitGB) et de calcul (EcpuPerSecondLimit) sont définies pour maîtriser les coûts.
3.6. Sécurité (nested/security.yaml)
- Security Groups : Agissent comme des pare-feux virtuels pour les ressources. Les règles sont très restrictives :
- Le groupe de sécurité ECS n'autorise le trafic entrant que depuis les CIDR des subnets privés (où se trouve le NLB) sur le port 80.
- Le groupe de sécurité ElastiCache n'autorise le trafic entrant que depuis le groupe de sécurité ECS sur le port 6379.
- VPC Endpoints :
- S3 (Gateway) : Permet aux tâches ECS d'accéder à S3 via le réseau privé d'AWS, ce qui est plus sécurisé et performant.
- Secrets Manager (Interface) : Permet de récupérer les secrets de l'application sans passer par Internet.
4. Déploiement et Mises à Jour
L'ensemble de cette infrastructure est défini en tant que code à l'aide de CloudFormation.
- Stack Racine (
main.yaml) : C'est le point d'entrée qui orchestre le déploiement de toutes les autres stacks. - Stacks Imbriquées (Nested Stacks) : Chaque composant majeur (réseau, ECS, S3, etc.) est défini dans son propre fichier template, ce qui favorise la modularité et la réutilisabilité.
Pour mettre à jour l'infrastructure, il est fortement recommandé d'utiliser les Change Sets (Jeux de modifications). Cette fonctionnalité de CloudFormation permet de prévisualiser l'impact des changements (quelles ressources seront ajoutées, modifiées ou supprimées) avant de les appliquer, réduisant ainsi considérablement le risque d'erreurs en production.
1. Package
aws cloudformation package \
--template-file main.yaml \
--s3-bucket beezyup-prod-c01-eu \
--output-template-file packaged.yml --profile AAubert-SKUP
2. Déploiement
aws cloudformation deploy --template-file /Users/aaubert/Documents/Provisioning/SKUP/aws/beezyup-prod-c01/packaged.yml --stack-name beezyup-prod-c01 --region eu-west-3 --capabilities CAPABILITY_NAMED_IAM --profile AAubert-SKUP
5. Cloudflare
Passer sur l'offre PRO afin d'avoir les règles d'optimisation mobile et sécurité
Migration vers Workers pour plateforme pour l'autoscaling