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 utiliser un pipeline Jenkins ?
- Automatiser le provisionnement d'infrastructure via Terraform
- Mettre en place une pipeline CI/CD sécurisée et reproductible
- Réduire les erreurs humaines et améliorer la traçabilité des déploiements
- Assurer une gestion multi-environnements cohérente (dev, staging, prod)
Pourquoi une CI/CD ?
1. Sécurité
- Moins de credentials exposés : Si chaque développeur doit appliquer Terraform depuis son poste, il faut leur donner un accès AWS étendu, ce qui augmente le risque d'erreurs ou de fuites.
- IAM minimal et centralisé : Dans un pipeline, les rôles et permissions sont gérés centralement. Les développeurs n'ont pas besoin d'accès direct à la prod.
- Auditabilité : Chaque déploiement via CI/CD est tracé automatiquement (logs, commit, approbations), ce qui facilite les audits.
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
- Création de modules réutilisables pour les ressources AWS (VPC, EC2, RDS, S3…)
- Gestion des états via backend S3 avec verrouillage DynamoDB
- Application des bonnes pratiques : versioning, variables sécurisées, nomenclature standardisée
Pipeline CI/CD
- Outil utilisé : Jenkins
- Étapes clés :
- Linting et formatage du code Terraform (
tflint,terraform fmt) - Validation des changements avec
terraform plan - Approbation manuelle pour la production
- Application automatisée via
terraform apply
- Linting et formatage du code Terraform (
- Gestion sécurisée des credentials AWS via Jenkins Credentials
- Notifications et logs centralisés pour suivi et audit
⚠️ 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.
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é
- Permissions IAM minimales pour chaque rôle
- Monitoring des déploiements via AWS CloudWatch
- Traçabilité complète des changements d'infrastructure
Résultats
- Réduction du temps de déploiement de l'infrastructure de 70%
- Élimination des erreurs humaines liées aux déploiements manuels
- Reproductibilité totale des environnements pour dev, staging et prod
- Possibilité de provisionner de nouveaux environnements en quelques minutes
Technologies utilisées
Terraform, AWS (EC2, S3, RDS, VPC, IAM), Jenkins, Bash, CloudWatch
Compétences mises en avant
- Automatisation d'infrastructure cloud
- CI/CD et DevOps best practices
- Gestion sécurisée des credentials et secrets
- Infrastructure as Code modulable et maintenable
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.