CI / CD infrastructure Terraform : Les différentes façons de tester et déployer son infra
Publié le
Do not index
Do not index
Primary Keyword
Lié à Analyse sémantique (Articles liés) 1
Lié à Analyse sémantique (Articles liés)
Statut rédaction
A optimiser SEO
Lié à Analyse sémantique (Articles liés) 2
IntroductionLes différents types de workflow Git de mise en production pour son infrastructureGit Flow : master|main en branche de référenceDétail du workflowAvantagesInconvénientsWorkflow 2 : Une branche par environnementDétail du workflowAvantagesInconvénientsLes étapes à inclure dans ses pipelines / workflowsLes différentes façons de réaliser des processus de validationTerraform CloudSpaceliftBrainboardGithub Action Entreprise + 1 environment par layer + Deployment protection rulesGithub Action + 1 issue de validation par layer modifié + CODEOWNERCréation d’une Github Apps dédiéComparatif des principaux éléments à avoir en têteSécuritéComplexité d’utilisation et de mise en placePrixConclusionAnnexe
Introduction
Choisir un modèle de CI / CD peut être complexe et structurant pour garantir une stabilité et la sécurité de ses infras.
Elle doit s’intégrer dans les processus opérationnels sans ajouter des frictions et ralentir les équipes.
Dans cet article je vais vous présenter plusieurs façons de mettre en place une CI / CD sur son repo d’infrastructure et je pèserai ensuite leurs avantages et inconvénients.
De cette façon, vous pourrez faire le choix qui sera le plus aligné en fonction de vos contraintes et de votre projet.
Dans cet article nous partirons du principe que :
- Le code de l’infrastructure est totalement séparé du code applicatif.
Il y a donc un ou plusieurs repos pour les composants applicatifs qui seront chargés de tester et release le code sous forme d’artefacts (image docker, binaire…) dans des registres et un repo dédié au code de l’infrastructure.
- Le code de l’infrastructure contient un dossier par environnement et plusieurs sous layer de code pour respecter les pratiques GitOps et Terraform comme l’exemple montré ci-dessous :
Les différents types de workflow Git de mise en production pour son infrastructure
Git Flow : master|main
en branche de référence
Détail du workflow
Ce premier workflow consiste à définir la branche
master|main
comme étant la branche de référence du code. Chaque nouveauté sur le code est testée et validée lors d’une pull-request et appliquée automatiquement ou manuellement lors du merge sur la branche de référence.Voici un résumé du comportement du workflow en lui-même :
Si push sur master :
- Pour chaque env/dossier :
- Job (Plan) : Vérifie si y a des changements à apply
- Job (Validate) : Valide que le code Terraform est fonctionnel
- Job (Apply) : Apply les modifs si y a des changements à appliquer.
^ Ce job aura un condition approval en fonction du nom de l'env
Si merge request :
- Pour chaque env :
- Job (Plan) : Vérifie si y a des changements à appliquer
- Job (Validate) : Valide que le code Terraform est fonctionnel
Avantages
- La branche
master
est la single source of truth, tout ce qui n’est pas sur master peut être considéré comme du drift d’infrastructure
- S’intègre très bien si l’équipe travaille en mode Github Flow
Inconvénients
- Peut générer des side-effects sur des environnements si des modifications ont été réalisées sur des modules communs à plusieurs envs et qu’il n’y a pas de validation manuelle appliquée sur cet env
Exemple :
Staging et preproduction utilisent tous deux un module pour créer son socle réseau.
Une modification sur le module réseau est réalisée
Elle est poussée sur master
Les envs staging et preproduction n’ayant pas de validation manuelle, alors les deux envs seront mis à jour automatiqument
- Prend beaucoup de temps pour tester des idées sur des environnements de sandbox par exemple
- Peut nécessiter l’utilisation d’un plan Github Entreprise si le repo est privé pour bénéficier des fonctionnalités de protection de branche. (Vous pouvez toujours contourner cette restriction avec cette action : https://github.com/marketplace/actions/manual-workflow-approval)
Workflow 2 : Une branche par environnement
Détail du workflow
Ce premier workflow consiste à créer une branche par environnement d’infrastructure. Chaque nouveauté doit passer d’un environnement à un autre comme montré sur l’image ci-dessous :
Avantages
- Permet de tester de façon plus souple ses infrastructures sur les environnements de tests sans avoir à passer par des processus de review d’équipe qui peuvent être lourds pour mettre sur la branche principale le code
- S’intègre très bien si l’équipe travaille en mode Git Flow
Inconvénients
- Le code sur la branche de production, peut avoir du drift par rapport à l’état réel de l’infrastructure car la source de vérité de l’état de l’infra est la branche de l’environnement et non plus master
Les étapes à inclure dans ses pipelines / workflows
Avant de présenter les différents workflows, il est important d’avoir en tête ce que ces workflows doivent réaliser.
Pour un repo d’infrastructure Terraform, voici les étapes les plus courantes :
- Validate : Vérifie que le code Terraform est valide et fonctionnel avec des commandes tels que
terraform validate
- Lint : Vérifie que le code Terraform est correctement formaté et respecte les bonnes pratiques de sécurité / disponibilité (Avec des linters comme tfsec, tflint, checkov, terraform fmt, terrascan, opa…)
- Cost Estimate : Réalise une analyse de coût de l’infrastructure et bloque ou non la pipeline en conséquence avec Infracost
- Plan : Lance un Terraform plan pour montrer les modifications qui seront apportées à l’infrastructure
- Approve : Attend une validation manuelle d’un ou plusieurs membre de l’équipe de façon conditionnelle selon l’environnement et le layer à déployer
- Deploy : Applique les modifications du plan sur l’infrastructure
Les différentes façons de réaliser des processus de validation
L’enjeu principal dans la mise en place d’une CI / CD pour un repo d’infrastructure est l’aspect validation avant application.
En effet l’architecture étant basée de plusieurs environnements et layers, il n’est pas recommandé d’avoir un système de validation global pour valider les modifications sur l’infrastructure mais plutôt de pouvoir contrôler de façon fine au niveau layer des modifications qui pourront être appliquées ou non sur l’infrastructure.
Voici 6 façons de réaliser un processus de validation pour appliquer les modifications sur son infrastructure lors de changement sur Git
Terraform Cloud
Terraform Cloud est une plateforme de gestion d'infrastructure en tant que code (IaC) qui permet aux équipes de collaborer efficacement, de provisionner et de gérer leur infrastructure sur plusieurs fournisseurs cloud, en utilisant le langage de configuration de Terraform.
En intégrant votre repository Git en tant que Workspace avec l’option
Version control workflow
, la plateforme permet de déclencher des plans automatiques lors de PRSpacelift
Spacelift est une plate-forme qui permet de créer rapidement des pipelines CI / CD élaboré pour tout type de langage d’infrastructure as a Code (Terraform, CloudFormation, Pulumi, Kubernetes et Ansible)
Brainboard
Brainboard est une plateforme de gestion cloud qui aide à concevoir, déployer et gérer une infrastructure multi-cloud de manière simple et économique.
La solution est basée sur le fait de créer des schémas qui généreront le code nécessaire pour déployer son infrastructure directement sur le cloud sans avoir à passer par le terminal.
Brainboard inclut un système de CI / CD intégré qui permettant de plan, lint, validate et apply ses infrastructures sans avoir à mettre en place sa propre CI / CD sous Github Action ou Gitlab-CI (par exemple)
Github Action Entreprise + 1 environment par layer + Deployment protection rules
La version Entreprise de Github permet nativement d’appliquer des règles de validation de déploiement par environnement. Pour se faire, il suffit d’aller dans l’onglet securité et de créer un environnement par layer et d’y ajouter les règles de protection désirés :
Dans son workflow Github Action, il suffira par la suite d’ajouter tout simplement le nom de son environnement dans son
job
comme ceci :name: Plan layers on PR
on:
pull_request:
types: [opened, reopened]
jobs:
plan:
name: Terraform Plan
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
environment: [
{name: staging, region: eu-west-1},
{name: preprod, region: eu-west-1},
{name: prod, region: eu-west-1}
]
layer: [
{name: 10-base, infra_conf_dir: 10_base},
{name: 20-eks-core-services, infra_conf_dir: 20_eks_core_services}
]
environment: ${{ matrix.environment.name }}-${{ matrix.layer.name }}
steps:
- name: Checkout repository
uses: actions/checkout@v3
...
Note : Cette fonctionnalité peut aussi être mise en place si le repository Git est public
Github Action + 1 issue de validation par layer modifié + CODEOWNER
Workflow 1 : Trigger lors d'une création de PR
Workflow 2 : Trigger lors d'un commentaire sur une PR avec un certain label ou d'un merge sur master
Création d’une Github Apps dédié
Github permet d’ajouter dans une organisation des applications qui peuvent réagir en fonction de différents événements. Cette méthode est bien plus complexe et chronophage à mettre en place cependant est totalement sur mesure et pourra être à avoir en tête si aucun autre moyen ne correspond aux contraintes de l’équipe.
Comparatif des principaux éléments à avoir en tête
Sécurité
ㅤ | Github Action Entreprise + 1 environment par layer + Deployment protection rules | Spacelift | Terraform Cloud | Brainboard | Github Action + 1 issue de validation par layer modifié + CODEOWNER |
Hosting Backend Tfstate | La solution n’a aucun impact sur ce sujet | Tous les backend supportés | Uniquement sur Terraform Backend | Tous les backend supportés | La solution n’a aucun impact sur ce sujet |
Environnement de lancement des workload Terraform | Github Action public runner ou private runner possible | Configurable en Remote ou Local après avoir installé l’agent sur sa VM (par exemple) | Configurable en Remote ou Local après avoir installé l’agent sur sa VM (par exemple) | Uniquement en Remote | Github Action public runner ou private runner possible |
Permet de lancer des linters de sécurité (Tfsec, Checkov…) | Oui totalement configurable | Oui, mais en boite noire | Non | Oui, totalement configurable | Oui, totalement configurable |
Workflow de validation du code avant mise en production | Totalement configurable en utilisant les différents types de trigger de Github | La validation d’un workflow de déploiement est appliquée avant de réaliser le plan
Politique de validation configurable en codant des règles Open Policy Agent (OPA)
Impossible à configurer autrement | Plan automatique lors d’une PR
Possibilité d’auto apply ou d’appliquer une preview de l’équipe lors d’un merge / commit sur la branche de référence
Impossible à configurer autrement | Totalement configurable | Totalement configurable en utilisant les différents types de trigger de Github |
Complexité d’utilisation et de mise en place
ㅤ | Github Action Entreprise + 1 environment par layer + Deployment protection rules | Spacelift | Terraform Cloud | Brainboard | Github Action + 1 issue de validation par layer modifié + CODEOWNER |
Complexité à mettre en place / Maintenabilité | Fonctionnement natif dans Github Entreprise
Pas de nouvel outil à apprendre ou maîtriser
Il suffit de créer un workflow qui ira apply sur les différents layers en utilisant les environnements et les strategy matrix par exemple | Plateforme qui peut sembler complexe au premier abord mais assez facile à prendre en main et à implémenter.
Dans le cas ou il l’on souhaite réaliser des systèmes de validation complexe, alors il faudra maîtriser le langage OPA, ce qui peut ajouter un peu de complexité. (Des exemples sont tout de fois disponible) | Dans le cas ou l’on accepte de lancer le code chez Hashicorp, il suffit d’initialiser un workspace Terraform qui synchronisera le repo avec l’infra en cas de PR et de commit
Le backend devra potentiellement être migré chez Terraform Cloud si l’infra utilisait déjà auparavant un autre type de backend (S3,…)
SI l’on ne souhaite pas lancer le code Demande d’installer un agent sur une VM | L’import du code se fait aisément sur la plateforme.
Toutefois le changement de paradigme pour les DevOps peut être complexe car ils perdent la main sur le code | Demande de bien maîtriser GIthub Action mais la mise en place reste assez traditionnelle.
La maintenabilité peut être un peu plus lourde que les autres solutions car plus de code à maintenir |
Maîtrise de son code Terraform | Oui | Oui | Oui | Non, une fois intégré sur la plateforme, l’idée est réaliser toutes modifications de l’infrastructure via la plateforme | Oui |
Prix
ㅤ | Github Action Entreprise + 1 environment par layer + Deployment protection rules | Spacelift | Terraform Cloud | Brainboard | Github Action + 1 issue de validation par layer modifié + CODEOWNER |
Prix licence | Licence Github Entreprise à 19.25$ / mois / user https://github.com/pricing | Gratuit si moins de deux users dans la team, sinon 250€ / mois jusqu’a 5 users et pour chaque user de plus 10€ / mois
https://spacelift.io/pricing | Licence Terraform Cloud gratuite jusqu’a 500 ressources déployées puis 0.00014$ par heure / ressources
https://www.hashicorp.com/products/terraform/pricing | Gratuit si moins de deux users, sinon 99$ / users / mois
https://www.brainboard.co/resources/pricing | Gratuit |
Conclusion
Il n’existe pas de bonne ou de mauvais workflow de CI / CD. Chaque workflow a ses forces et faiblesse. Le choix d’un workflow doit se faire en fonction de l’affinité des équipes et leurs adoptions par les équipes.
Il faut bien définir en amont le processus de validation désiré pour son équipe et vérifier la possibilité de l’implémenter avec les outils marché.
Une fois validé, vous pourrez implémenter le workflow Git que vous préférez.