CI / CD infrastructure Terraform : Les différentes façons de tester et déployer son infra

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

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 :
    • notion image

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

notion image
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
notion image

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

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 :
 
notion image

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 PR
notion image

Spacelift

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 :
notion image
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.

Annexe

 

S'inscrire à la newsletter DevSecOps Keltio

Pour recevoir tous les mois des articles d'expertise du domaine

S'inscrire

Écrit par

Kévin Didelot
Kévin Didelot

Kévin est notre super expert DevSecOps et le fondateur de Keltio 👨🏻‍💻 

Sujets