Services ECS
1 - Qu'est-ce qu'un Service ?
Un Service ECS maintient automatiquement le nombre souhaité de tasks en exécution et gère le déploiement de nouvelles versions.
2 - Types de services
2.1 Service REPLICA
Maintient un nombre spécifique de tasks réparties sur le cluster.
{
"serviceName": "api-service",
"desiredCount": 3,
"schedulingStrategy": "REPLICA"
}
2.2 Service DAEMON
Exécute exactement une task sur chaque instance EC2 du cluster.
{
"serviceName": "monitoring-agent",
"schedulingStrategy": "DAEMON"
}
3 - Créer un Service
3.1 Via CLI
aws ecs create-service \
--cluster prod-cluster \
--service-name api-service \
--task-definition api:3 \
--desired-count 3 \
--launch-type FARGATE \
--platform-version LATEST \
--network-configuration "awsvpcConfiguration={
subnets=[subnet-111,subnet-222],
securityGroups=[sg-123],
assignPublicIp=DISABLED
}" \
--load-balancers "targetGroupArn=arn:aws:elasticloadbalancing:...:targetgroup/api/123,containerName=app,containerPort=8080" \
--health-check-grace-period-seconds 60 \
--deployment-configuration "maximumPercent=200,minimumHealthyPercent=100" \
--enable-execute-command
3.2 Via CloudFormation
ECSService:
Type: AWS::ECS::Service
DependsOn: ALBListener
Properties:
ServiceName: api-service
Cluster: !Ref ECSCluster
TaskDefinition: !Ref TaskDefinition
DesiredCount: 3
LaunchType: FARGATE
PlatformVersion: LATEST
NetworkConfiguration:
AwsvpcConfiguration:
Subnets:
- !Ref PrivateSubnet1
- !Ref PrivateSubnet2
SecurityGroups:
- !Ref ServiceSecurityGroup
AssignPublicIp: DISABLED
LoadBalancers:
- TargetGroupArn: !Ref TargetGroup
ContainerName: app
ContainerPort: 8080
HealthCheckGracePeriodSeconds: 60
DeploymentConfiguration:
MaximumPercent: 200
MinimumHealthyPercent: 100
DeploymentCircuitBreaker:
Enable: true
Rollback: true
DeploymentController:
Type: ECS
EnableExecuteCommand: true
ServiceRegistries:
- RegistryArn: !GetAtt ServiceDiscoveryService.Arn
Tags:
- Key: Environment
Value: Production
4 - Stratégies de déploiement
4.1 Rolling Update (ECS)
4.2 Blue/Green (CodeDeploy)
DeploymentController:
Type: CODE_DEPLOY
# Nécessite CodeDeploy deployment group
4.3 Configuration de déploiement
| Paramètre | Description |
|---|---|
MaximumPercent | % max de tasks pendant déploiement |
MinimumHealthyPercent | % min de tasks saines pendant déploiement |
DeploymentCircuitBreaker | Rollback automatique sur échec |
# Déploiement prudent (pas de downtime)
DeploymentConfiguration:
MaximumPercent: 200
MinimumHealthyPercent: 100
# Déploiement rapide (accepte downtime temporaire)
DeploymentConfiguration:
MaximumPercent: 200
MinimumHealthyPercent: 50
5 - Circuit Breaker
DeploymentConfiguration:
DeploymentCircuitBreaker:
Enable: true
Rollback: true
Le circuit breaker détecte les échecs de déploiement et effectue un rollback automatique si :
- Les tasks échouent au démarrage
- Les health checks échouent
- Le déploiement dépasse le timeout
6 - Service Discovery
6.1 AWS Cloud Map
ServiceDiscoveryNamespace:
Type: AWS::ServiceDiscovery::PrivateDnsNamespace
Properties:
Name: internal.local
Vpc: !Ref VPC
ServiceDiscoveryService:
Type: AWS::ServiceDiscovery::Service
Properties:
Name: api
NamespaceId: !Ref ServiceDiscoveryNamespace
DnsConfig:
DnsRecords:
- Type: A
TTL: 60
HealthCheckCustomConfig:
FailureThreshold: 1
# Dans le service ECS
ECSService:
Properties:
ServiceRegistries:
- RegistryArn: !GetAtt ServiceDiscoveryService.Arn
6.2 Utilisation
# Les tasks s'enregistrent automatiquement
# DNS: api.internal.local
# Depuis un autre conteneur
curl http://api.internal.local:8080/health
7 - Mise à jour d'un service
7.1 Nouvelle Task Definition
# Créer nouvelle révision
aws ecs register-task-definition --cli-input-json file://task-def-v2.json
# Mettre à jour le service
aws ecs update-service \
--cluster prod-cluster \
--service api-service \
--task-definition api:4 \
--force-new-deployment
7.2 Scaling manuel
# Changer le nombre de tasks
aws ecs update-service \
--cluster prod-cluster \
--service api-service \
--desired-count 5
7.3 Force new deployment
# Forcer le redéploiement (même task definition)
aws ecs update-service \
--cluster prod-cluster \
--service api-service \
--force-new-deployment
8 - ECS Exec
Accès shell aux conteneurs en cours d'exécution.
8.1 Activer
ECSService:
Properties:
EnableExecuteCommand: true
# Task Role doit avoir
{
"Effect": "Allow",
"Action": [
"ssmmessages:CreateControlChannel",
"ssmmessages:CreateDataChannel",
"ssmmessages:OpenControlChannel",
"ssmmessages:OpenDataChannel"
],
"Resource": "*"
}
8.2 Utiliser
# Se connecter à un conteneur
aws ecs execute-command \
--cluster prod-cluster \
--task abc123 \
--container app \
--interactive \
--command "/bin/bash"
9 - Gestion des services
# Lister les services
aws ecs list-services --cluster prod-cluster
# Détails d'un service
aws ecs describe-services \
--cluster prod-cluster \
--services api-service
# Arrêter un service (set desired count to 0)
aws ecs update-service \
--cluster prod-cluster \
--service api-service \
--desired-count 0
# Supprimer un service
aws ecs delete-service \
--cluster prod-cluster \
--service api-service \
--force
Résumé
Dans ce chapitre, nous avons appris :
- Les types de services (REPLICA vs DAEMON)
- La création de services via CLI et CloudFormation
- Les stratégies de déploiement (Rolling, Blue/Green)
- Le Circuit Breaker pour les rollbacks automatiques
- Le Service Discovery avec Cloud Map
- La mise à jour des services
- ECS Exec pour le debugging
Prochaine étape
Dans le prochain chapitre, nous verrons le Networking et Load Balancing.
→ Chapitre suivant : Networking et Load Balancing