Amazon Elastic Container Service (ECS) est un service d'orchestration de conteneurs entièrement géré par AWS. Il permet de déployer, faire évoluer et gérer des applications conteneurisées sans avoir à installer ni administrer soi-même un orchestrateur.
ECR (vu dans les articles précédents) se contente de stocker les images Docker, ECS s'occupe de les exécuter : il décide sur quelle machine lancer un conteneur, combien d'instances faire tourner, comment les remplacer en cas de panne, et comment les exposer au trafic réseau.
ECS peut être vu comme une alternative plus simple et plus intégrée à AWS que Kubernetes (ou son équivalent managé, EKS) : moins de concepts à apprendre, une intégration native avec IAM, VPC, CloudWatch et les load balancers AWS, au prix d'une portabilité moindre en dehors d'AWS.
Les deux modes de calcul : EC2 et Fargate
ECS ne fournit pas lui-même la puissance de calcul : il orchestre des conteneurs sur une infrastructure sous-jacente, qui peut être de deux natures.
Mode EC2
Les conteneurs s'exécutent sur des instances EC2 que vous provisionnez et gérez vous-même. Ces instance font tourner un agent ECS qui communique avec le control plane ECS pour recevoir et exécuter des tâches. Ce mode offre plus de contrôle (choix du type d'instance, accès SSH, optimisation fine des coûts avec des réservations ou du spot) mais implique aussi de gérer le patching, le scaling et le dimensionnement du cluster.
Mode Fargate
Fargate est un mode d'exécution serverless : AWS provisionne et gère automatiquement l'infrastructure nécessaire pour exécuter les conteneurs. Il n'y a plus d'instances EC2 à gérer, plus de capacité à dimensionner à l'avance. La facturation se fait à la ressource réellement consommée (vCPU/mémoire) pendant la durée d'exécution des contenaires.
Les composants clés d'ECS
- Cluster : espace logique qui regroupe les ressources sur lesquelles les conteneurs seront exécutés.
- Task Definition : modèle décrivant l'application à exécuter (image Docker, CPU, mémoire, ports, variables d'environnement, etc.).
- Task : instance en cours d'exécution d'une Task Definition.
- Service : maintient un nombre défini de tâches en fonctionnement et permet leur intégration avec un Load Balancer ainsi que la mise à l'échelle.
Déploiement
Cluster
On commence par la création d'un Cluster.
Dans le service Elastic Container Service, cliquez sur Clusters, puis sur Create cluster.Donnez un nom à votre cluster, par exemple
demo-cluster.Dans la section Infrastructure, sélectionnez le type de capacité souhaité. ici je selectionne Fargate and self-managed instances qui permet d'utiliser Farget et aussi avoir des instances EC2 que je gère moi-même.
Task Definition
Une fois le cluster créé, on définit la Task Definition qui décrit comment exécuter notre conteneur demo-app (l'image poussée sur ECR dans l'article précedent).
Donnez un nom, par exemple
demo-app-task, choisissez le type de lancement : AWS Fargate.Configurez la taille de la Task :
- CPU : par exemple 0.5 vCPU.
- Mémoire : par exemple 1 GB.
- Name :
demo-app. - Image URI :
<account_id>.dkr.ecr.eu-west-3.amazonaws.com/demo-app:latest. - Container port : le port exposé par l'application, par exemple
80.
Service:
demo-cluster, allez dans l'onglet Services, puis cliquez sur Create.Dans Networking, choisissez le VPC et les subnets, et un security group autorisant le trafic sur le port du conteneur (
80).