L'Infrastructure as Code : Une Révolution DevOps

L'Infrastructure as Code (IaC) transforme la gestion des infrastructures cloud en permettant de définir, déployer et maintenir les ressources via du code. Cette approche apporte reproductibilité, versioning et automatisation à la gestion d'infrastructure traditionnellement manuelle.

Terraform : Le Couteau Suisse Multi-Cloud

Vue d'Ensemble

Terraform, développé par HashiCorp, est un outil open-source qui utilise le langage HCL (HashiCorp Configuration Language) pour définir l'infrastructure de manière déclarative.

Avantages de Terraform

  • Multi-cloud : AWS, Azure, GCP, et 1000+ providers
  • État centralisé : Suivi précis des ressources
  • Plan d'exécution : Prévisualisation des changements
  • Communauté active : Modules réutilisables
  • Syntaxe claire : HCL lisible et maintenable

Exemple Terraform

# main.tf
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

provider "aws" {
  region = var.aws_region
}

# VPC Configuration
resource "aws_vpc" "main" {
  cidr_block           = "10.0.0.0/16"
  enable_dns_hostnames = true
  enable_dns_support   = true

  tags = {
    Name = "${var.project_name}-vpc"
  }
}

# Internet Gateway
resource "aws_internet_gateway" "main" {
  vpc_id = aws_vpc.main.id

  tags = {
    Name = "${var.project_name}-igw"
  }
}

# Public Subnet
resource "aws_subnet" "public" {
  count             = length(var.availability_zones)
  vpc_id            = aws_vpc.main.id
  cidr_block        = "10.0.${count.index + 1}.0/24"
  availability_zone = var.availability_zones[count.index]

  map_public_ip_on_launch = true

  tags = {
    Name = "${var.project_name}-public-${count.index + 1}"
  }
}

# EC2 Instance
resource "aws_instance" "web" {
  ami           = data.aws_ami.ubuntu.id
  instance_type = var.instance_type
  subnet_id     = aws_subnet.public[0].id

  vpc_security_group_ids = [aws_security_group.web.id]

  user_data = <<-EOF
              #!/bin/bash
              apt-get update
              apt-get install -y nginx
              systemctl start nginx
              systemctl enable nginx
              EOF

  tags = {
    Name = "${var.project_name}-web"
  }
}

Variables et Outputs

# variables.tf
variable "aws_region" {
  description = "AWS region"
  type        = string
  default     = "eu-west-1"
}

variable "project_name" {
  description = "Project name"
  type        = string
}

variable "instance_type" {
  description = "EC2 instance type"
  type        = string
  default     = "t3.micro"
}

variable "availability_zones" {
  description = "Availability zones"
  type        = list(string)
  default     = ["eu-west-1a", "eu-west-1b"]
}

# outputs.tf
output "vpc_id" {
  value = aws_vpc.main.id
}

output "instance_public_ip" {
  value = aws_instance.web.public_ip
}

CloudFormation : L'Outil Natif AWS

Vue d'Ensemble

AWS CloudFormation est le service natif d'Amazon pour l'IaC, utilisant des templates JSON ou YAML pour définir les ressources AWS.

Avantages de CloudFormation

  • Intégration native AWS : Support immédiat des nouveaux services
  • Pas de coût supplémentaire : Inclus dans AWS
  • Rollback automatique : Gestion d'erreurs intégrée
  • Stack dependencies : Gestion des dépendances
  • IAM intégré : Sécurité granulaire

Exemple CloudFormation

# infrastructure.yaml
AWSTemplateFormatVersion: '2010-09-09'
Description: 'Infrastructure web basique'

Parameters:
  ProjectName:
    Type: String
    Description: Nom du projet
  
  InstanceType:
    Type: String
    Default: t3.micro
    AllowedValues:
      - t3.micro
      - t3.small
      - t3.medium

Resources:
  # VPC
  MainVPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsHostnames: true
      EnableDnsSupport: true
      Tags:
        - Key: Name
          Value: !Sub '${ProjectName}-vpc'

  # Internet Gateway
  InternetGateway:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        - Key: Name
          Value: !Sub '${ProjectName}-igw'

  # Attach Gateway to VPC
  AttachGateway:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId: !Ref MainVPC
      InternetGatewayId: !Ref InternetGateway

  # Public Subnet
  PublicSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref MainVPC
      CidrBlock: 10.0.1.0/24
      AvailabilityZone: !Select [0, !GetAZs '']
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: !Sub '${ProjectName}-public-subnet'

  # Security Group
  WebSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Security group for web server
      VpcId: !Ref MainVPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 443
          ToPort: 443
          CidrIp: 0.0.0.0/0

  # EC2 Instance
  WebServer:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-0c02fb55956c7d316  # Amazon Linux 2
      InstanceType: !Ref InstanceType
      SubnetId: !Ref PublicSubnet
      SecurityGroupIds:
        - !Ref WebSecurityGroup
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash
          yum update -y
          yum install -y httpd
          systemctl start httpd
          systemctl enable httpd
          echo "

Hello from ${ProjectName}

" > /var/www/html/index.html Tags: - Key: Name Value: !Sub '${ProjectName}-web' Outputs: VPCId: Description: VPC ID Value: !Ref MainVPC Export: Name: !Sub '${ProjectName}-VPC-ID' WebServerPublicIP: Description: Public IP of web server Value: !GetAtt WebServer.PublicIp

Comparaison Détaillée

Syntaxe et Lisibilité

Critère Terraform CloudFormation
Langage HCL (déclaratif) JSON/YAML
Lisibilité Excellente Bonne (YAML) / Moyenne (JSON)
Courbe d'apprentissage Modérée Raide

Fonctionnalités

Fonctionnalité Terraform CloudFormation
Multi-cloud ✅ Excellent ❌ AWS uniquement
État (State) ✅ Fichier state explicite ✅ Géré par AWS
Plan d'exécution ✅ terraform plan ✅ Change sets
Rollback ⚠️ Manuel ✅ Automatique
Import ressources ✅ terraform import ✅ CloudFormation import

Écosystème et Support

Aspect Terraform CloudFormation
Communauté ✅ Très active ⚠️ Limitée
Modules/Templates ✅ Registry riche ⚠️ Moins fourni
Nouveaux services AWS ⚠️ Délai de support ✅ Support immédiat
Documentation ✅ Excellente ✅ Très bonne

Cas d'Usage et Recommandations

Choisir Terraform quand :

  • Multi-cloud : Infrastructure sur plusieurs providers
  • Équipes DevOps expérimentées : Maîtrise des outils HashiCorp
  • Réutilisabilité : Modules partagés entre projets
  • Contrôle granulaire : Gestion fine de l'état
  • Intégration CI/CD : Pipelines automatisés

Choisir CloudFormation quand :

  • AWS uniquement : Infrastructure 100% AWS
  • Simplicité : Équipes moins expérimentées
  • Nouveaux services : Besoin du support immédiat
  • Intégration native : Avec les services AWS
  • Coût : Pas de licence supplémentaire

Bonnes Pratiques

Terraform

  • Remote State : S3 + DynamoDB pour le locking
  • Modules : Réutilisation et standardisation
  • Workspaces : Gestion des environnements
  • Validation : terraform validate + tflint
  • Sécurité : Secrets via variables d'environnement

CloudFormation

  • Nested Stacks : Modularité et réutilisation
  • Parameters : Configuration flexible
  • Outputs : Communication entre stacks
  • Change Sets : Validation avant déploiement
  • Stack Policies : Protection des ressources critiques

Outils Complémentaires

Pour Terraform

  • Terragrunt : Orchestration et DRY
  • Atlantis : Pull request automation
  • Terraform Cloud : SaaS HashiCorp
  • tfsec : Analyse de sécurité

Pour CloudFormation

  • AWS CDK : Infrastructure avec du code
  • CloudFormation Guard : Validation de policies
  • Serverless Framework : Applications serverless
  • AWS SAM : Applications serverless simplifiées

Tendances et Évolution

Terraform

  • CDK for Terraform : Infrastructure avec TypeScript/Python
  • Terraform Cloud : Adoption SaaS croissante
  • Policy as Code : Sentinel et OPA
  • GitOps : Intégration avec ArgoCD

CloudFormation

  • AWS CDK : Adoption massive
  • CloudFormation Hooks : Extensibilité
  • StackSets : Déploiement multi-comptes
  • Service Catalog : Gouvernance d'entreprise

Conclusion

Le choix entre Terraform et CloudFormation dépend largement de votre contexte :

  • Terraform excelle dans les environnements multi-cloud avec des équipes DevOps expérimentées
  • CloudFormation est idéal pour les infrastructures AWS pures avec une courbe d'apprentissage plus douce

Dans la pratique, de nombreuses organisations utilisent les deux outils selon les besoins spécifiques de chaque projet. L'important est de choisir l'outil qui correspond le mieux à votre équipe, votre architecture et vos objectifs business.

Besoin d'aide pour choisir et implémenter votre stratégie IaC ? Contactez-moi pour un accompagnement personnalisé.