Applications distribuées : microservices et conteneurs sur AWS

C’est le moment idéal pour aborder ce qui va certainement définir le paradigme des années à venir : les microservices comme méthode de déploiement des applications distribuées dans le cloud. Lorsque nous parlons de microservices, nous parlons de décomposer les composants de l'application afin que le service que nous fournissons soit le résultat d'une coopération entre des applications plus petites, dont le rôle est clairement défini.

Avantages des microservices

Différencier les responsabilités entre les microservices est aussi important que de mesurer la flexibilité qu’elle permet lorsque nous les mettons en œuvre. Nous ne sommes pas tenus de choisir un langage ou une technologie de programmation qui recouvre toutes les fonctionnalités de l'application : il n'y a pas de format unique, c'est pourquoi nous pouvons choisir la meilleure technologie et la meilleure mise en œuvre pour chaque composant, sans se préoccuper des autres. L'API constitue l'élément essentiel, le contrat interne à travers lequel les composants définissent leur mode de communication.
La flexibilité du développement ne se limite pas aux décisions technologiques. Chaque application peut maintenant suivre son propre cycle de développement et de test pour sortir des mises à jour à son rythme, en réduisant le temps nécessaire à l'introduction de nouvelles fonctionnalités ou de corrections des erreurs à destination de l'utilisateur final.
Depuis la simplification des applications, nous n'avons plus besoin de grosses équipes composées de nombreux développeurs. Comme le dit Werner Vogels, « Votre équipe toute entière doit pouvoir être nourrie avec deux pizzas ».

Déploiement des microservices

Cette philosophie n'est pas un simple concept théorique. Adrian Cockcroft, responsable de l'évolution de Netflix dans le cloud, a effectué une présentation dès l'édition 2014 de la DockerCon, dans laquelle il évoque sa propre expérience des systèmes complexes de Netflix, ainsi que les avantages que le concept de microservices a apportés, les changements survenus et les nouveaux outils qu'il a fallu développer.

Il est important de souligner qu'il n'est pas nécessaire d'être de la taille de Netflix pour tirer profit des microservices. Avoir la possibilité de se défaire d'une technologie du passé est essentiel pour que de petites entreprises s'adaptent aux changements et innovent, faisant constamment évoluer leurs produits. Évidemment, il est aussi nécessaire de recycler les vieux concepts et d'affronter de nouveaux défis.
Une fois que nous avons décidé d'opter pour une architecture microservices pour notre application, nous devons définir la manière dont les composants sont enregistrés et interagissent en utilisant l'API, même lorsqu'ils ont été développés par des équipes différentes et déployés à des moments différents. Au bout du compte, nous devons garantir que tous les composants librement associés offrent les mêmes fonctionnalités que notre ancienne application monolithique.
Docker est probablement la meilleure solution de déploiement de microservices dans des conteneurs. Pour gérer ces derniers, il est possible d'utiliser Docker Compose, qui nous laisse définir les différents conteneurs utilisés par notre application et leurs liens dans un fichier YAML unique.

Déploiement des microservices sur AWS

Comment déployer nos conteneurs sur Amazon Web Services ? EC2 Container Service serait la meilleure réponse, mais il ne faut pas oublier qu'Elastic Beanstalk inclut déjà un support pour Docker.

EC2 Container Service

ECS est un service géré qui distribue nos applications à l'intérieur de conteneurs Docker sur un cluster composé d'instances EC2. Ainsi, nous n'avons plus qu'à gérer et créer les conteneurs, sans nous soucier de l’infrastructure.
Si nous disposons déjà d'un fichier YAML configuré par Docker Compose, nous pouvons le convertir au format ECS en utilisant Container-Transform. Celui-ci effectue non seulement la conversion, mais il nous indique également les paramètres manquants, comme les délimiteurs de ressources qu'ECS utilise pour distribuer les conteneurs à l'intérieur du cluster.
Le fichier de configuration du cluster ECS utilise le format JSON, voisin du format YAML de Docker Compose. Nous pouvons le générer à partir de la console Web d'AWS ou simplement le créer en utilisant notre éditeur de texte favori. Chaque conteneur est défini comme une Tâche dans ECS.

Docker multi-conteneurs sur Elastic Beanstalk

Malgré l'apparente simplicité d'Elastic Beanstalk, la version multi-conteneurs de Docker est plutôt avancée. Elle se base sur un cluster ECS orchestré par CloudFormation et ne distribue pas les Tâches en fonction des ressources disponibles, mais exécute les mêmes conteneurs sur une ou plusieurs instances. Un ELB (équilibreur de charge) distribue le trafic entrant sur les différentes instances en direction du port exposé, en général le port 80.
La personnalisation des conteneurs sur Elastic Beanstalk s'effectue à travers un fichier JSON spécial appelé Dockerrun.aws.json où il est possible de définir les volumes, les conteneurs et leurs interactions.
Ci-après, un exemple classique d'application PHP avec deux conteneurs : nginx-proxy et php-app, basés sur php:fpm.

conteneurAWS1.png

Ce fichier de configuration détermine, pour le conteneur nginx-proxy un lien vers php-app qui lui permet d'accéder au port php-fpm. Dans le même temps, les deux conteneurs ont accès à l'application et stockent les logs dans un dossier partagé de l'hôte.
En fait, il suffit simplement de nous rendre dans le menu ECS pour visualiser les détails du cluster créé automatiquement par Elastic Beanstalk.

conteneurAWS2.png

Conclusion

Comme nous pouvons le voir, il existe une multitude d'options pour déployer nos conteneurs et nos microservices sur AWS. D’ailleurs, nous sommes presque sûrs que ces outils vont évoluer dans les mois à venir. Bien que l’élasticité et la haute disponibilité soient aujourd’hui des méthodes largement répandues, le déploiement et la mise en œuvre des microservices devraient prendre le dessus dans un futur proche.

Source : traduction et adaptation de la page http://blog.celingest.com/en/2015/05/08/distributed-apps-microservices-c...