Automatisation du provisionnement d'infrastructure AWS avec Terraform et CI/CD

Contexte

L'entreprise devait déployer rapidement et de manière fiable son infrastructure cloud sur AWS. Les processus manuels entraînaient des erreurs et limitaient la scalabilité. L'objectif était d'automatiser l'ensemble du cycle de vie des environnements pour gagner en efficacité et en sécurité.

Objectifs

Pourquoi une CI/CD ?

1. Sécurité

2. Reproductibilité et cohérence

Les environnements sont provisionnés toujours de la même manière, car le pipeline applique le même code et les mêmes modules Terraform pour tous les environnements. Les erreurs liées à des configurations locales différentes (version Terraform, plugins, variables locales mal configurées) sont éliminées. On peut garantir que dev, staging et prod sont identiques sur le plan infra.

3. Contrôle des changements et workflow

Le pipeline permet d'intégrer un review/approval step, ce qui évite de déployer par accident des changements non validés en production. On peut tester les plans (terraform plan) automatiquement et détecter les impacts avant l'application. Les changements sont liés à des commits précis, ce qui facilite le rollback si besoin.

4. Automatisation et productivité

Les équipes n'ont plus besoin de répéter manuellement des commandes Terraform, ce qui réduit le temps et le stress. La CI/CD peut inclure des tests automatiques (linting, plan validation, tests d'intégration), ce qui augmente la qualité. Les déploiements deviennent prévisibles et rapides, même pour des environnements complexes.

5. Scalabilité

Avec plusieurs équipes ou projets, laisser chacun faire ses apply devient vite chaotique. Un pipeline centralise et standardise les déploiements, ce qui permet de gérer plusieurs environnements et projets en parallèle sans conflits.

💡 En résumé : Le pipeline CI/CD transforme le déploiement Terraform de processus manuel, risqué et difficile à tracer en processus automatisé, sécurisé, reproductible et auditable, ce qui est essentiel pour toute infrastructure moderne.

Solution mise en place

Infrastructure as Code avec Terraform

Pipeline CI/CD

⚠️ Sécurité des credentials :
Il est formellement interdit d'exporter les variables d'environnement dans un pipeline. Utilisez le plugin pipeline-aws ou withAWS dans Jenkins pour injecter les credentials de manière sécurisée.

Jenkinsfile (Groovy)
pipeline {
    agent any

    // environment {
    //   AWS_ACCESS_KEY_ID = credentials('aws-access-key-id')
    //   AWS_SECRET_ACCESS_KEY = credentials('aws-secret-access-key')
    // }
    options {
        ansiColor('xterm')     // ✅ active les couleurs dans toute la console
        timestamps()           // (optionnel) ajoute un horodatage dans les logs
    }

    stages {
        stage('Checkout') {
            steps {
                checkout scm
            }
        }

        stage('Terraform Init') {
            steps {
                sh 'terraform init'
            }
        }

        stage('Terraform Plan') {
            steps {
                withAWS(credentials: '2308dbbf-1fae-4511-8ab8-c8098dc0dac4', region: 'eu-west-3') {
                    sh 'terraform plan -out=tfplan'
                }
            }
        }

        stage('Terraform Apply') {
            when {
                expression { return params.DO_APPLY }
            }
            steps {
                withAWS(credentials: '2308dbbf-1fae-4511-8ab8-c8098dc0dac4', region: 'eu-west-3') {
                    sh 'terraform apply -input=false -auto-approve tfplan'
                }
            }
        }
    }

    parameters {
        booleanParam(
            name: 'DO_APPLY',
            defaultValue: false,
            description: 'Appliquer les changements ?'
        )
    }
}

Sécurité et observabilité

Résultats

Technologies utilisées

Terraform, AWS (EC2, S3, RDS, VPC, IAM), Jenkins, Bash, CloudWatch

Compétences mises en avant

Astuce visuelle pour le portfolio

💡 Astuce visuelle pour le portfolio :
Tu peux ajouter un petit diagramme simplifié montrant : Git commit → Jenkins pipeline → Terraform plan → Terraform apply → AWS infra, ça rend tout de suite le projet plus concret.


Document inspiré par la documentation officielle de Terraform by HashiCorp.