Aller au contenu principal

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ètreDescription
MaximumPercent% max de tasks pendant déploiement
MinimumHealthyPercent% min de tasks saines pendant déploiement
DeploymentCircuitBreakerRollback 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


← Retour à la table des matières