RousselTMLEARNING

DevOps

Application 12 Facteurs

Un guide détaillé sur la méthodologie des 12 facteurs pour le développement d'applications modernes et scalables dans des environnements cloud. La conception à douze facteurs vous permet de dissocier les composants de l'application, lesquels peuvent ainsi être remplacés, augmentés ou réduits facilement. Les facteurs étant indépendants de tout langage de programmation et de toute pile logicielle, la conception à douze facteurs peut être appliquée à une grande variété d'applications.

Introduction #

Explication des principes des applications 12 facteurs, une méthodologie conçue pour les applications modernes et les microservices, permettant une meilleure maintenabilité, scalabilité et déploiement en continu.

Codebase #

Une seule base de code par application avec gestion de versions.

Principe #

Chaque application doit avoir une seule base de code versionnée dans un dépôt, même si elle est déployée dans plusieurs environnements. Cela garantit la cohérence du code entre les environnements.

Gestion des versions #

L'utilisation de systèmes de contrôle de version (ex. Git) permet de maintenir des versions de l'application et de faciliter le suivi des modifications.

Bénéfices #

Améliore la traçabilité, la collaboration et la gestion des versions pour les équipes, surtout en environnement agile.

Dépendances #

Déclarer explicitement et isoler les dépendances de l'application.

Déclaration explicite #

Spécifiez toutes les dépendances de l'application dans un fichier de configuration (comme requirements.txt pour Python ou package.json pour Node.js) pour faciliter l'installation et la maintenance.

Isolation des dépendances #

Utiliser des environnements isolés pour chaque application (ex. virtualenv en Python, conteneurs Docker) pour éviter les conflits de dépendances entre projets.

Configuration #

Externaliser les configurations pour séparer le code et les paramètres d'environnement.

Variables d'environnement #

Utiliser des variables d'environnement pour stocker les configurations de l'application, comme les clés API, URL de base de données, etc. Cela évite d'exposer des informations sensibles dans le code.

Flexibilité et sécurité #

Les configurations par environnement permettent de déployer la même base de code dans différents environnements (dev, prod) sans modification du code.

Backing Services #

Traiter les services externes (base de données, files d'attente) comme des ressources attachées.

Ressources interchangeables #

Les services externes doivent être facilement remplaçables sans modifier le code, en changeant uniquement la configuration. Cela facilite la migration vers de nouvelles solutions.

Portabilité #

En utilisant des services basés sur des configurations externes, il devient facile de déplacer l'application vers d'autres environnements ou fournisseurs.

Build, Release, Run #

Distinguer les étapes de build, release et run pour une meilleure gestion des déploiements.

Processus de build #

Le processus de build compile le code et regroupe toutes les dépendances, générant une version déployable de l'application.

Processus de release #

Associe le build à des configurations spécifiques et enregistre cette version prête pour le déploiement. Chaque release doit être immuable et identifiable (ex. par un numéro de version ou un tag).

Processus de run #

L'étape où le code est exécuté dans l'environnement de production. Cette séparation améliore la gestion des versions et facilite les rollbacks en cas de besoin.

Processes #

Exécuter l'application sous forme de processus stateless pour favoriser la scalabilité.

État dans les services #

Les processus ne doivent pas conserver d'état ; ils doivent utiliser des services externes (comme une base de données) pour stocker l'état de l'application.

Scalabilité horizontale #

Les processus stateless permettent d'ajouter ou retirer facilement des instances, augmentant la capacité d'accueil sans impact sur la cohérence des données.

Port Binding #

L'application doit être auto-contenue et exposée via un port spécifique.

Communication via le réseau #

L'application doit être accessible directement via un port, facilitant le déploiement dans des environnements comme Docker ou Kubernetes.

Flexibilité des services #

Permet de combiner différents services dans un même environnement en les assignant chacun à un port spécifique.

Concurrency #

Optimiser l'application pour fonctionner avec plusieurs processus concurrents.

Modèle de process horizontal #

Utiliser des processus indépendants et scalables en parallèle, ce qui facilite la gestion de charges de travail variables.

Multiprocessing #

Adopter des modèles de traitement parallèle pour maximiser l'utilisation des ressources.

Disposability #

Faciliter le démarrage et l'arrêt rapides des processus.

Démarrage rapide #

Les processus doivent démarrer rapidement pour être réactifs face aux charges de travail fluctuantes.

Gestion de l'arrêt #

En cas d'arrêt, les processus doivent cesser de façon contrôlée pour éviter les corruptions de données.

Dev/Prod Parity #

Maintenir une parité forte entre les environnements de développement, staging et production.

Parité des environnements #

Éviter les divergences entre les différents environnements pour minimiser les risques d’erreurs lors des déploiements.

Amélioration des tests #

Une parité de configuration améliore la fiabilité des tests en garantissant que ce qui est testé en développement fonctionnera en production.

Logs #

Les logs sont un flux d'événements à centraliser pour une analyse efficace.

Flux continu #

Les logs doivent être traités comme un flux d'événements continus, collectés et centralisés, sans être enregistrés localement dans le fichier système.

Centralisation #

Envoyer les logs vers un service centralisé facilite la surveillance et le dépannage des applications en production.

Admin Processes #

Les tâches administratives sont gérées en tant que processus one-off.

Processus ponctuels #

Exécuter les tâches de maintenance ou d'administration comme des processus isolés, ex. en utilisant des scripts one-off pour des migrations de base de données ou des traitements ponctuels.

Sécurité et stabilité #

Les processus one-off évitent les interférences avec le code en cours d’exécution et garantissent la stabilité de l'application.

Pour aller plus loin