AWS a récemment annoncé AWS Fargate, un service permettant d'exécuter des conteneurs sans devoir gérer des serveurs ou des clusters. Si vous n'étiez pas en train d'hiberner au cours de ces dernières années, vous avez probablement remarqué que Docker avait changé la méthode de travail des développeurs et la façon dont les serveurs de production sont exécutés.

En théorie, ça semble simple. Mais la réalité est tout autre et même si vous n'exécutez que des conteneurs, vous devrez toujours gérer l'infrastructure sous-jacente. Et je suis sûre que vous savez déjà que ce n'est pas une mince affaire !

AWS Fargate arrive à point nommé, devenant pour l'environnement Docker ce que les instances EC2 étaient au début de l'adoption du Cloud : il vous suffit d'avoir votre image Docker, de configurer votre mémoire et votre CPU et de définir le réseau et les politiques IAM pour que Fargate exécute votre conteneur. Et tout cela s'accompagne d'une tarification en fonction des ressources et d'une facturation à la seconde. Plus facile à dire qu'à faire !

Pré-requis :

Je vais me concentrer sur l'exécution des conteneurs, mais Fargate est nativement intégré à Amazon Virtual Private Cloud et Access Management (IAM), donc vous devrez configurer votre propre VPC si vous n'en avez pas encore ou si vous ne voulez pas utiliser le VPC par défaut. Vous devez également vous assurer que le conteneur est exécuté avec le bon rôle IAM afin de l'autoriser à réaliser des appels vers les API AWS.

Le test HelloWorld : exécuter un conteneur Nuxeo unique

Suivez ces étapes lorsque vous avez besoin de créer rapidement une instance Nuxeo, par exemple pour vos démos.

Naviguez vers la page ECS dans votre console AWS.

1. Créer un nouveau cluster Fargate

(Paradoxalement, cette première étape va un peu à l'encontre de la philosophie de Fargate : "run containers without having to manage servers or clusters" - exécutez des conteneurs sans aucun serveur ou cluster à gérer)

  • Dans le modèle de cluster, sélectionnez "powered by Fargate"
  • Définissez le nom du cluster et créez un nouveau VPC pour celui-ci si vous n'en avez pas

Create a new Fargate cluster 1

2. Créer une nouvelle définition de tâche

  • Choisissez Fargate en tant que type d'exécution
  • Choisissez les rôles adaptés. Je vais utiliser le rôle basique ecsTaskExecutionRole
  • Sélectionnez "awsvpc" dans la section "Network Mode". Chaque tâche crée à partir de cette définition recevra une interface réseau Elastic, une adresse IP privée et un nom de DNS interne
  • Configurez la taille de la tâche : Task memory (GB) et Task CPU (ce que vous payez pour une facturation à la seconde)

Create a new Fargate cluster 2

Créer une nouvelle définition de conteneur

Create a new Fargate cluster 3

Il s'agit d'une configuration minimale. Pour un résultat plus avancé, consultez la page Advanced Task Definition Parameters.

Pour définir les volumes de données de notre conteneur, sélectionnez Add volume. J'ai déjà créé un volume EBS, et je vais juste externaliser ce "binary store" pour qu'il utilise ce volume.

Create a new Fargate cluster 4

Retournez maintenant à la définition de votre conteneur et associez Nuxeo à ce volume :

  • Éditez la définition du conteneur et, dans la section "Advanced container configuration", ajoutez la variable d'environnement NUXEO_BINARY_STORE

Create a new Fargate cluster 5

  • Dans la section Storage and Logging, configurez un point de montage pour le volume défini précédemment.

Create a new Fargate cluster 6

  • Cliquez sur Create et vous devriez voir la définition de votre tâche sur la page Task Definitions :

Create a new Fargate cluster 7

3. Exécuter une nouvelle tâche pour instancier un conteneur à partir de la définition de votre tâche ou pour créer un service

La méthode la plus simple pour exécuter un seul conteneur autonome est de sélectionner la tâche HelloWorld et de choisir RunTask à partir du menu Actions.

Assurez-vous de sélectionner le cluster créé lors de l'étape 1 et configurez le VPC et les groupes de sécurité. Et pour accéder plus rapidement à votre instance, pensez à activer l'option "Auto-assign public IP".

Create a new Fargate cluster 8

Après avoir cliqué sur RunTask, vous pouvez revenir à votre onglet cluster/tasks pour voir votre tâche avec le statut provisioning, pending et enfin running. Cliquez sur l'ID de la tâche dans la liste pour accéder aux détails de la tâche en cours et aux journaux d'événements.

Vous avez également la possibilité de créer un service qui démarre et exécute en continu le nombre de tâches souhaité à partir de votre définition de tâche. Cela vous permet de configurer un équilibrage des charges et un auto-scaling et d'effectuer des mises à jour continues lorsque la définition de votre tâche évolue.

Create a new Fargate cluster 9

Comment accéder à mon instance Nuxeo ?

Le mode réseau "awsvpc" configuré dans la définition de tâche donne aux tâches ECS les mêmes attributs réseau que les instances Amazon EC2. Si vous avez activé l'option Auto Assign Public IP lors de l'exécution de votre tâche, vous disposez déjà d'une adresse IP publique rattachée à votre EIN. Elle n'est pas affichée directement dans la tâche, donc vous devrez devez naviguer vers l'EIN depuis la page de description de la tâche pour la trouver.

Create a new Fargate cluster 10

Avec une adresse IP publique, je devrais pouvoir accéder à mon instance Nuxeo en cours d'exécution. Mais il s'avère que

curl http://54.175.225.0:8080/nuxeo/runningstatus

renvoie :

curl: (7) Failed to connect to 54.175.225.0 port 8080: Operation timed out.

Le groupe de sécurité rattaché à l'EIN ne contient par défaut aucune règle pour le port 8080. Il faut ajouter cette règle manuellement :

Create a new Fargate cluster 11

Après ça, le contrôle standard se déroule normalement :
curl http://54.175.225.0:8080/nuxeo/runningstatus
{"runtimeStatus":"ok","elasticSearchStatus":"ok","ldapDirectories":"ok","repositoryStatus":"ok"}

Et je peux accéder à mon instance Nuxeo :

Create a new Fargate cluster 12

Comment mettre à jour mon instance si je veux installer un nouveau package de la marketplace ?

À ce stade, j'exécute une instance Nuxeo de base. Nous aimerions déployer notre incroyable WebUI Nuxeo.

Pour ajouter un nouveau package de la marketplace, vous devez créer une nouvelle révision de la définition de votre tâche et exécuter une nouvelle tâche venant remplacer celle qui existe.

  • Allez sur Task Definitions, sélectionnez la tâche HelloWorld et créez une nouvelle révision de tâche.
  • Mettez à jour la définition du conteneur pour passer la variable d'environnement NUXEO_PACKAGES.

Create a new Fargate cluster 13

Si vous exécutez une tâche autonome, vous devrez forcément arrêter la tâche en cours et en lancer une nouvelle à partir de la version mise à jour.

Si vous exécutez votre tâche à partir d'un service, vous pouvez mettre ce service à jour pour qu'il effectue une mise à jour continue en fonction de sa configuration.

Après avoir arrêté et démarré une nouvelle tâche, l'instance Nuxeo est de nouveau opérationnelle :

Create a new Fargate cluster 14

Conclusion

Actuellement, Fargate simplifie la gestion des clusters, mais les configurations ECS restent toujours aussi complexes. Les démarrages de projets restent donc assez fastidieux.