AWS - Avancé : ECS, IAM avancé et architecture multi-région
🎯 Objectifs
- ✅ Déployer des conteneurs en production avec ECS Fargate et ECR
- ✅ Orchestrer Kubernetes avec EKS
- ✅ Maîtriser les politiques IAM avancées : cross-account, permission boundaries, SCP
- ✅ Automatiser avec CloudFormation StackSets et CDK
- ✅ Concevoir une architecture multi-région avec Route 53
- ✅ Optimiser les coûts avec Reserved Instances, Savings Plans et Spot
📋 Prérequis
- AWS Intermédiaire (VPC, RDS, Lambda, CloudFormation)
- Kubernetes Débutant (concepts pods, services, kubectl)
- Docker Intermédiaire (images, registries)
🐳 ECS - Elastic Container Service
Fargate vs EC2 Launch Type
ECS orchestre des conteneurs Docker sur AWS. Deux modes de fonctionnement :
| Critère | Fargate | EC2 Launch Type |
|---|---|---|
| Gestion des serveurs | AWS (serverless) | Vous gérez les EC2 |
| Contrôle de l'OS | Aucun | Total |
| Coût | Plus cher à l'usage | Moins cher en continu |
| Scalabilité | Instantanée | Dépend de l'ASG |
| Cas d'usage | Applications standard | Workloads GPU, haute performance |
Concepts ECS
Cluster ECS
├── Service (maintient N tâches en vie)
│ ├── Task Definition (blueprint : image, CPU, mémoire, ports)
│ └── Task (instance en cours d'exécution)
└── Capacity Provider (Fargate ou EC2)ECR - Elastic Container Registry
ECR est le registry Docker d'AWS, intégré nativement avec IAM.
# Créer un repository ECR
aws ecr create-repository \
--repository-name mon-app \
--image-scanning-configuration scanOnPush=true
# Authentifier Docker vers ECR
aws ecr get-login-password --region eu-west-3 | \
docker login --username AWS --password-stdin \
123456789.dkr.ecr.eu-west-3.amazonaws.com
# Tagger et pousser une image
docker tag mon-app:latest 123456789.dkr.ecr.eu-west-3.amazonaws.com/mon-app:latest
docker push 123456789.dkr.ecr.eu-west-3.amazonaws.com/mon-app:latestDéployer sur ECS Fargate
# Créer la Task Definition
aws ecs register-task-definition \
--family mon-app-task \
--network-mode awsvpc \
--requires-compatibilities FARGATE \
--cpu 256 \
--memory 512 \
--execution-role-arn arn:aws:iam::ACCOUNT:role/ecsTaskExecutionRole \
--container-definitions '[{
"name": "mon-app",
"image": "123456789.dkr.ecr.eu-west-3.amazonaws.com/mon-app:latest",
"portMappings": [{"containerPort": 8080, "protocol": "tcp"}],
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/ecs/mon-app",
"awslogs-region": "eu-west-3",
"awslogs-stream-prefix": "ecs"
}
}
}]'
# Créer le cluster ECS
aws ecs create-cluster --cluster-name mon-cluster
# Créer le service ECS
aws ecs create-service \
--cluster mon-cluster \
--service-name mon-app-service \
--task-definition mon-app-task \
--desired-count 2 \
--launch-type FARGATE \
--network-configuration '{
"awsvpcConfiguration": {
"subnets": ["subnet-priv-a", "subnet-priv-b"],
"securityGroups": ["sg-xxxx"],
"assignPublicIp": "DISABLED"
}
}' \
--load-balancers '[{
"targetGroupArn": "arn:aws:elasticloadbalancing:...",
"containerName": "mon-app",
"containerPort": 8080
}]'☸️ EKS - Elastic Kubernetes Service
Quand choisir EKS plutôt qu'ECS ?
- Vous avez déjà des manifestes Kubernetes existants
- Vous voulez des workloads portables (multi-cloud possible)
- Vous avez besoin de l'écosystème Kubernetes (Helm, Operators, service mesh)
Créer un cluster EKS avec eksctl
# Installer eksctl
curl --silent --location \
"https://github.com/eksctl-io/eksctl/releases/latest/download/eksctl_Linux_amd64.tar.gz" \
| tar xz -C /tmp
sudo mv /tmp/eksctl /usr/local/bin
# Créer un cluster (prend ~15 minutes)
eksctl create cluster \
--name mon-cluster-eks \
--region eu-west-3 \
--nodegroup-name standard-nodes \
--node-type t3.medium \
--nodes 2 \
--nodes-min 1 \
--nodes-max 4 \
--managed
# Configurer kubectl automatiquement
aws eks update-kubeconfig --name mon-cluster-eks --region eu-west-3
# Vérifier les noeuds
kubectl get nodes
# Déployer une application
kubectl apply -f deployment.yaml
# Supprimer le cluster
eksctl delete cluster --name mon-cluster-eks --region eu-west-3Fargate Profile pour EKS
Les Fargate Profiles permettent d'exécuter des pods Kubernetes sur Fargate (sans gérer les EC2) :
eksctl create fargateprofile \
--cluster mon-cluster-eks \
--name mon-profile-fargate \
--namespace production🔐 IAM Avancé
Politiques basées sur les ressources
Contrairement aux politiques IAM attachées à des identités (utilisateurs, rôles), les politiques basées sur les ressources s'attachent à la ressource elle-même et définissent qui peut y accéder.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::AUTRE_COMPTE:root"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::mon-bucket-partage/*"
}
]
}Rôles Cross-Account
Permettent à une identité d'un compte AWS d'accéder à des ressources dans un autre compte.
Compte A (source) Compte B (cible)
└── Utilisateur Alice ──→ └── Rôle "ReadOnlyRole"
(sts:AssumeRole) └── Politique: S3 ReadOnly# Dans le compte B : créer le rôle avec une Trust Policy vers le compte A
aws iam create-role \
--role-name ReadOnlyRole \
--assume-role-policy-document '{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {"AWS": "arn:aws:iam::COMPTE_A:root"},
"Action": "sts:AssumeRole"
}]
}'
# Depuis le compte A : assumer le rôle
aws sts assume-role \
--role-arn arn:aws:iam::COMPTE_B:role/ReadOnlyRole \
--role-session-name alice-sessionPermission Boundaries
Une Permission Boundary limite le maximum de permissions qu'une identité peut avoir, même si une politique plus permissive lui est attachée.
Permissions effectives = Politiques IAM ∩ Permission BoundaryCas d'usage : permettre aux développeurs de créer leurs propres rôles, sans qu'ils puissent s'octroyer des permissions d'administrateur.
Service Control Policies (SCP) dans AWS Organizations
Les SCP s'appliquent à des unités d'organisation (OU) entières et limitent ce que tous les comptes fils peuvent faire, indépendamment de leurs politiques IAM.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": ["ec2:*"],
"Resource": "*",
"Condition": {
"StringNotEquals": {
"aws:RequestedRegion": ["eu-west-3", "eu-west-1"]
}
}
}
]
}Cette SCP interdit toute action EC2 en dehors des régions européennes.
🏗️ CloudFormation Avancé et CDK
StackSets - Déployer dans plusieurs comptes/régions
# Créer un StackSet (déploie dans plusieurs comptes depuis un compte administrateur)
aws cloudformation create-stack-set \
--stack-set-name mon-stackset \
--template-body file://template.yaml \
--permission-model SERVICE_MANAGED \
--auto-deployment Enabled=true,RetainStacksOnAccountRemoval=false
# Déployer dans des OUs entières
aws cloudformation create-stack-instances \
--stack-set-name mon-stackset \
--deployment-targets OrganizationalUnitIds=ou-xxxx \
--regions eu-west-3 eu-west-1 us-east-1CDK - Cloud Development Kit
Le CDK permet de définir l'infrastructure dans un vrai langage de programmation (TypeScript, Python, Java...). Il génère du CloudFormation sous le capot.
// lib/mon-stack.ts
import * as cdk from 'aws-cdk-lib';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
import * as ecs from 'aws-cdk-lib/aws-ecs';
export class MonStack extends cdk.Stack {
constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// VPC avec sous-réseaux publics et privés dans 2 AZ
const vpc = new ec2.Vpc(this, 'MonVPC', {
maxAzs: 2,
natGateways: 1,
});
// Cluster ECS
const cluster = new ecs.Cluster(this, 'MonCluster', { vpc });
}
}# Déployer avec CDK
cdk deploy🌍 Architecture Multi-Région avec Route 53
Route 53 - DNS managé
Route 53 supporte plusieurs politiques de routage :
| Politique | Comportement | Cas d'usage |
|---|---|---|
| Simple | Un enregistrement, une valeur | Site statique |
| Pondéré | Distribution selon un poids | Tests A/B, migration progressive |
| Latence | Redirige vers la région la plus rapide | Audience mondiale |
| Failover | Bascule vers un secondaire si le primaire est en panne | Haute disponibilité |
| Géolocalisation | Selon la localisation de l'utilisateur | Conformité RGPD, contenu localisé |
# Créer une zone hébergée
aws route53 create-hosted-zone \
--name monsite.fr \
--caller-reference $(date +%s)
# Créer un enregistrement de routage par latence
aws route53 change-resource-record-sets \
--hosted-zone-id ZXXXX \
--change-batch '{
"Changes": [{
"Action": "CREATE",
"ResourceRecordSet": {
"Name": "api.monsite.fr",
"Type": "A",
"Region": "eu-west-3",
"SetIdentifier": "paris",
"AliasTarget": {
"HostedZoneId": "Z...",
"DNSName": "mon-alb.eu-west-3.elb.amazonaws.com",
"EvaluateTargetHealth": true
}
}
}]
}'Architecture Active-Active Multi-Région
Route 53 (routage par latence)
/ \
eu-west-3 us-east-1
(Paris) (Virginie)
│ │
ALB ALB
│ │
ECS Service ECS Service
│ │
RDS ←── Réplication ──→ RDS Read Replica
(Primary) (Promoted en besoin)💰 Optimisation des Coûts
Modèles de tarification EC2
| Modèle | Réduction | Engagement | Interruptible |
|---|---|---|---|
| On-Demand | - | Aucun | Non |
| Reserved Instances | jusqu'à 72% | 1 ou 3 ans | Non |
| Savings Plans | jusqu'à 66% | 1 ou 3 ans | Non |
| Spot Instances | jusqu'à 90% | Aucun | Oui (2 min de préavis) |
Règle : On-Demand pour les ressources imprévisibles, Reserved/Savings Plans pour la baseline stable, Spot pour les workloads tolérants aux interruptions (batch, CI/CD).
Outils d'optimisation
# Analyser les coûts avec Cost Explorer
aws ce get-cost-and-usage \
--time-period Start=2024-01-01,End=2024-02-01 \
--granularity MONTHLY \
--metrics BlendedCost \
--group-by Type=DIMENSION,Key=SERVICE
# Créer une alerte de budget
aws budgets create-budget \
--account-id ACCOUNT_ID \
--budget '{
"BudgetName": "Alerte 100EUR",
"BudgetLimit": {"Amount": "100", "Unit": "USD"},
"TimeUnit": "MONTHLY",
"BudgetType": "COST"
}' \
--notifications-with-subscribers '[{
"Notification": {
"NotificationType": "ACTUAL",
"ComparisonOperator": "GREATER_THAN",
"Threshold": 80
},
"Subscribers": [{"SubscriptionType": "EMAIL", "Address": "alerte@example.com"}]
}]'🏛️ Well-Architected Framework
Les 6 piliers d'une architecture AWS bien conçue :
| Pilier | Principe clé |
|---|---|
| Excellence opérationnelle | Automatiser, observer, améliorer en continu |
| Sécurité | Moindre privilège, défense en profondeur, chiffrement |
| Fiabilité | Redondance multi-AZ, recovery automatique |
| Efficacité des performances | Choisir le bon type de ressource, monitorer |
| Optimisation des coûts | Pay-as-you-go, Spot, Reserved selon l'usage |
| Durabilité | Réduire l'empreinte carbone des workloads |
📌 Points Clés
- ECS Fargate = conteneurs sans gérer de serveurs ; EKS = Kubernetes managé pour les workloads portables
- Les SCP bloquent à l'échelle des OU entières - elles s'imposent même aux administrateurs des comptes fils
- Le CDK génère du CloudFormation mais s'écrit dans un vrai langage de programmation
- Route 53 routage par latence = les utilisateurs sont envoyés vers la région la plus rapide pour eux
- Spots pour le batch, Reserved/Savings Plans pour la baseline : économies jusqu'à 90%