Amazon Containers - ECS, ECR et Fargate
Photo de Simon Goetz sur Unsplash

AWS offre plusieurs Services de gestion de conteneurs. On peut citer :

  • Amazon ECS pour Elastic Container Service
  • Amazon Fargate qui permet d’exĂ©cuter Amazon ECS en Serverless
  • Amazon EKS pour Amazon Elastic Kubernetes Service et qui permet de gĂ©rer un Cluster Kubernetes

Dans cet article, nous parlerons des 2 premiers Services, Amazon EKS méritant un chapitre à lui tout seul.



Amazon ECS

  • Amazon Elastic Container Service (Amazon ECS) est un service de gestion de conteneurs hautement scalable et rapide
  • C’est un Cluster d’instances EC2 : chaque instance exĂ©cute un Agent ECS (le conteneur Docker)
  • L’Agent ECS sert, de plus, Ă  enregister l’instance dans le Cluster ECS
  • Il existe des AMIs (Amazon Machine Image) qui contiennent un Agent ECS

Composition d’un Cluster ECS

Un Cluster ECS contient :

  • Une ou plusieurs instances EC2 :
    • Instances de type AMI amazon-ami-ecs-optimized qui repose sur l’image Docker amazon/amazon-ecs-agent:latest
    • Avec un stockage EBS ou EFS
    • Et une Key Pair pour y accĂ©der
  • Il s’intègre dans un VPC sur un ou plusieurs Subnets pour ĂŞtre hautement disponible (multi-AZ):
    • Un ASG est crĂ©Ă© automatiquement et contient une Launch Configuration qui configure le nom du Cluster ECS dans chaque fichier /etc/ecs/ecs.config de chaque instance EC2
  • Chaque instance EC2 est protĂ©gĂ©e par un Security Group
  • A chaque instance EC2 est ajoutĂ© le Role ecsInstanceRole qui repose sur la Policy AmazonEC2ContainerServiceforEC2Role, managĂ© par AWS, et qui permet Ă  l’Agent ECS de faire des appels Ă  l’API ECS

ECS Task

  • C’est le formalisme d’AWS (en JSON) pour dĂ©finir ce que contient le fichier Dockerfile et qui va servir Ă  dĂ©finir un conteneur Docker
  • Il contient le nom de l’image Ă  exĂ©cuter, le mapping des ports entre l’hĂ´te et le conteneur, la quantitĂ© de mĂ©moire et de CPU que le conteneur aura Ă  disposition, les variables d’environnement Ă  passer au conteneur,…

Security Group

Dans le Security Group des instances EC2, pensez à autoriser le port de l’application définit pour l’hôte afin de pouvoir accéder à l’application dans le conteneur

Placement des Tasks dans le Cluster ECS

Le placement des Tasks s’effectue en mode “best-effort”. Amazon ECS tente toujours de placer des tâches même lorsque l’option de placement la plus optimale est indisponible. Cependant, les contraintes de placement des Tasks sont contraignantes, et elles peuvent empêcher le placement des Tasks.

Lorsque Amazon ECS place des Tasks, il utilise le processus suivant pour sélectionner une instance de conteneur:

  1. Il identifie les instances qui satisfont les exigences du processeur, de la mémoire et du port dans la définition de la tâche
  2. Il identifie les instances qui satisfont aux contraintes de placement des Tasks
  3. Il détermine les instances qui satisfont aux stratégies de placement des Tasks
  4. Il sélectionne les instances de placement des Tasks

Stratégie de placement

Il existe différentes stratégies de placement :

  • binpack :
    • Les Tasks sont placĂ©es sur des instances de conteneurs de manière Ă  laisser le moins de CPU ou de mĂ©moire inutilisĂ©e
    • Cette stratĂ©gie minimise le nombre d’instances dans le Cluster ECS et donc les coĂ»ts associĂ©s
  • random :
    • Les Tasks sont placĂ©es au hasard sur les instances disponibles
  • spread :
    • Les Tasks sont rĂ©parties en fonction d’une valeur spĂ©cifiĂ©e. Les valeurs acceptĂ©es sont instanceId ou n’importe quel attribut personnalisĂ© qui peut s’appliquer Ă  une instance ECS, comme l’attribut: ecs.availability-zone
    • Dans le cas d’un attribut ecs.availability-zone, les Tasks seront rĂ©parties sur toutes les AZ du Cluster ECS

ECS Service

ECS Service définit comment démarrer une ECS Task : c’est l’équivalent du fichier SWARM de Docker ou des fichiers de configuration Service/Replica/Deployment… de Kubernetes

Il indique :

  • Combien de Tasks devraient ĂŞtre dĂ©marrĂ©es (min, max, souhaitĂ©es) :
    • ECS Service Auto Scaling permet une mise Ă  l’échelle automatique des Tasks
  • Comment les rĂ©partir entre les instances EC2 du Cluster
  • ECS Cluster Auto Scaling (CAS) permet d’ajouter ou de supprimer automatiquement des instances EC2 au Cluster ECS
  • L’accès Ă  l’application au travers d’un Elastic Load Balancer (au choix ALB, NLB, CLB) :
    • Le dynamic port forwarding du LB permet de ne pas spĂ©cifier de Port cĂ´tĂ© HĂ´te et c’est le LB qui fera le mapping automatiquement
    • Cette fonctionalitĂ© nĂ©cessite de modifier le Security Group des instances EC2 (autorisation de tous les ports pour le SG du Load Balancer)

ECS Auto Scaling

Auto Scaling

  • Comme on peut le constater, la documentation AWS fait mention en de très nombreux termes Ă  l’Auto Scaling : ici ECS Service Auto Scaling, ECS Cluster Auto Scaling,…
  • En rĂ©alitĂ©, AWS Auto Scaling (le service gĂ©nĂ©rique) est organisĂ© en 2 catĂ©gories :
    • Amazon EC2 Auto Scaling, lorsque cela concerne une instance EC2
    • Application Auto Scaling, pour tout ce qui n’est pas EC2

Dans ECS, il existe un Cluster Capacity Provider qui, associé à un Auto Scaling Group, gére le dimensionnement des instances du Cluster


Amazon ECR

  • Amazon Elastic Container Registry (Amazon ECR) est un registre d’images de conteneurs gĂ©rĂ© par AWS qui est sĂ©curisĂ©, scalable et robuste.
  • Amazon ECR repose sur des autorisations AWS IAM pour pousser et rĂ©cupĂ©rer les images de son registre.
  • Il propose diffĂ©rentes fonctionalitĂ©s comme le scan de sĂ©curitĂ© des images ou la rĂ©plication Cross-Region et Cross-Account

Utilisation en ligne de commande

  • Authentification du Client Docker au registre ECR avec AWS CLI v1 ou v2 :
$(aws ecr get-login-password --no-include-email --region <region>)
Cli-v1
aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <aws_account_id>.dkr.ecr.<region>.amazonaws.com
Cli-v2
  • Tag de l’image Docker avec l’URL du registre :
docker tag <docker-image-name>:latest <aws_account_id>.dkr.ecr.<region>.amazonaws.com/<docker-image-name>:latest
Zsh
  • Push de l’image Docker dans le registre :
docker push <aws_account_id>.dkr.ecr.<region>.amazonaws.com/<docker-image-name>:latest
Zsh

Les Roles derrière tout ça

Il est important d’avoir à l’esprit l’utilisation des Roles qui est faite par ECS et ce qui reste à configurer par l’utilisateur :

  • Les instance EC2 qui font partie d’un Cluster ECS possèdent implicitement des Roles leur permettant d’interagir avec :
    • ECS Service : utilisĂ© par l’Agent ECS pour faire des appels Ă  l’API ECS Service
    • CloudWatch Logs : pour envoyer les logs d’utilisation Ă  l’API CloudWatch
    • ECR Service : pour rĂ©cupĂ©rer l’image Docker du dĂ©pĂ´t ECR
  • Mais l’utilisateur doit spĂ©cifier les Roles nĂ©cessaires aux ECS Tasks, par exemple :
    • AmazonS3ReadOnlyAccess pour une application dĂ©finie dans une Task qui accèdera Ă  un Bucket S3
    • AmazonEC2FullAccess pour une application qui accèdera Ă  l’API EC2

IAM Role et Instance Profile

On trouvera les deux termes pour désigner, selon les cas, la même chose en fait :

  • L’Instance Profile est l’instanciation, dans une instance EC2, des permissions dĂ©finies dans un IAM Role
  • Le IAM Role Ă©tant juste la dĂ©finition de permissions

Amazon Fargate

  • AWS Fargate permet de crĂ©er un Cluster Amazon ECS sans se soucier des instances Amazon EC2.
  • C’est la version Serverless de Amazon ECS
  • La crĂ©ation des Tasks est similaire Ă  celle dans ECS mais Fargate s’occupe de leur fournir un environnement d’exĂ©cution

C’est donc beaucoup plus simple.

Jean-Jerome Levy

Ecrit par

Jean-JĂ©rĂ´me LĂ©vy

Consultant DevOps

Professionnel chevronné dans le domaine de l’informatique, cumulant plus de 20 années d’expérience au sein de DSI de grandes entreprises, mon expertise diversifiée m’a permis de jouer un rôle clé dans de nombreux projets, caractérisés par la mise en place de pratiques DevOps innovantes.