Pourquoi Infrastructure as Code pour l'IA ?
Déployer manuellement une infrastructure IA sur AWS, c'est garantir des incohérences entre les environnements, des erreurs humaines et une impossibilité de reproduire exactement la même configuration. Terraform résout tous ces problèmes en un seul fichier déclaratif.
Prérequis : Terraform v1.6+, AWS CLI configuré, kubectl installé. Coût estimé de l'infrastructure : 800-2000€/mois selon les workloads.
Structure du projet Terraform
ai-infra-aws/
├── main.tf # Point d'entrée
├── variables.tf # Variables paramétrables
├── outputs.tf # Valeurs exposées
├── versions.tf # Versions des providers
├── modules/
│ ├── networking/ # VPC, subnets, security groups
│ ├── eks/ # Cluster Kubernetes
│ ├── rds/ # Base de données PostgreSQL
│ ├── s3/ # Stockage modèles et datasets
│ ├── sagemaker/ # Studio et endpoints
│ └── monitoring/ # CloudWatch, alertes
Étape 1 : VPC et networking
module "networking" {
source = "./modules/networking"
vpc_cidr = "10.0.0.0/16"
availability_zones = ["eu-west-3a", "eu-west-3b", "eu-west-3c"]
private_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
public_subnets = ["10.0.101.0/24", "10.0.102.0/24", "10.0.103.0/24"]
enable_nat_gateway = true
single_nat_gateway = false # HA par AZ
tags = {
Project = "ai-platform"
Environment = var.environment
ManagedBy = "terraform"
}
}
Étape 2 : Cluster EKS pour workloads ML
module "eks" {
source = "terraform-aws-modules/eks/aws"
version = "~> 20.0"
cluster_name = "ai-platform-${var.environment}"
cluster_version = "1.29"
vpc_id = module.networking.vpc_id
subnet_ids = module.networking.private_subnets
# Node groups pour ML
eks_managed_node_groups = {
# Noeud CPU pour inférence légère
cpu_workers = {
instance_types = ["m5.2xlarge"]
min_size = 2; max_size = 10; desired_size = 3
}
# Noeuds GPU pour entraînement
gpu_workers = {
instance_types = ["g4dn.xlarge"]
min_size = 0; max_size = 4; desired_size = 0
taints = [{ key = "nvidia.com/gpu", value = "true", effect = "NO_SCHEDULE" }]
}
}
}
Étape 3 : S3 pour datasets et modèles
resource "aws_s3_bucket" "ml_artifacts" {
bucket = "nando-it-ml-${var.environment}-${random_id.suffix.hex}"
tags = local.common_tags
}
resource "aws_s3_bucket_versioning" "ml_artifacts" {
bucket = aws_s3_bucket.ml_artifacts.id
versioning_configuration { status = "Enabled" }
}
# Lifecycle pour optimiser les coûts
resource "aws_s3_bucket_lifecycle_configuration" "ml_artifacts" {
bucket = aws_s3_bucket.ml_artifacts.id
rule {
id = "archive-old-models"
status = "Enabled"
transition {
days = 90
storage_class = "GLACIER"
}
}
}
Étapes 4-10 : RDS, SageMaker, monitoring...
Les étapes suivantes couvrent : RDS PostgreSQL pour les métadonnées MLflow, SageMaker Studio pour l'expérimentation interactive, ElastiCache Redis pour le caching des prédictions, CloudWatch pour le monitoring et les alertes, et le déploiement des rôles IAM avec le principe du moindre privilège.
Le code complet est disponible sur demande — je l'inclus dans mes missions de consulting.
Conseils pour réduire les coûts
- Utilisez des Spot Instances pour les entraînements (économie de 60-90%)
- Activez l'autoscaling sur tous les node groups, y compris le scale-to-zero pour les GPU
- Utilisez Compute Savings Plans pour les workloads prévisibles
- Archivez automatiquement les anciens modèles vers S3 Glacier
- Utilisez Karpenter au lieu du Cluster Autoscaler pour une meilleure réactivité