AWS Lambda vs ECS Fargate : guide de choix selon vos besoins
← Retour au blogAWS

AWS Lambda vs ECS Fargate : guide de choix selon vos besoins

5 février 20258 min de lectureAWS LambdaECS FargateServerless

Lambda et ECS Fargate sont complémentaires mais souvent confondus. Ce guide vous aide à choisir le bon service selon vos contraintes de latence, durée d'exécution et budget.

Deux approches "serverless", deux modèles radicalement différents

AWS Lambda et ECS Fargate sont tous deux qualifiés de "serverless" — vous ne gérez pas les serveurs sous-jacents. Mais leurs modèles d'exécution sont fondamentalement différents, et confondre les deux mène à des architectures sous-optimales, voire coûteuses. Ce guide vous donne les critères de décision que nous utilisons avec nos clients.

AWS Lambda : function-as-a-service

Lambda exécute votre code en réponse à des événements dans un environnement éphémère. Chaque invocation est indépendante. Les caractéristiques clés :

  • Durée maximale : 15 minutes par invocation (hard limit, non modifiable)
  • Mémoire : 128 MB à 10 GB (le CPU est alloué proportionnellement à la mémoire)
  • Stockage éphémère : /tmp jusqu'à 10 GB (512 MB par défaut, augmentable payant)
  • Cold starts : 50 ms à 2 s selon le runtime — Python/Node rapides, Java lent sans SnapStart
  • Déclencheurs natifs : S3, SQS, SNS, DynamoDB Streams, API Gateway, EventBridge, Kinesis — Lambda est le cœur de l'architecture event-driven AWS
  • Concurrence : 1 000 exécutions simultanées par défaut (augmentable à 10 000+)

ECS Fargate : container-as-a-service

Fargate exécute vos conteneurs Docker dans des environnements gérés sans que vous provisioniez d'instances EC2. La tâche démarre une fois et reste active pour servir de multiples requêtes :

  • Durée : illimitée — les processus long-running (ML inference, WebSockets, traitement batch) sont natifs
  • Ressources : 0,25 à 16 vCPU, 512 MB à 120 GB RAM par tâche
  • Réseau : intégration native ALB/NLB, VPC complet, Security Groups, connexions persistantes à la base de données
  • Runtime : n'importe quel langage, n'importe quelle bibliothèque système — total liberté
  • Démarrage : 30 à 60 secondes pour démarrer une nouvelle tâche (vs quelques millisecondes pour Lambda)

Tableau comparatif — 10 critères

Critère Lambda ECS Fargate
Durée d'exécutionMax 15 minIllimitée
Cold start50ms–2s30–60s (démarrage tâche)
Mémoire max10 GB120 GB
RéseauVPC optionnelVPC natif
Dev localSAM CLI (complexe)docker-compose (simple)
Modèle de coûtPar invocationPar heure
Vitesse de scale-outImmédiate (millisecondes)30–90s (nouvelle tâche)
Connexions persistantesNon (RDS Proxy requis)Oui (natif)
Runtime personnaliséLimité (layers)Total (Docker)
Vendor lock-inÉlevéModéré (Docker standard)

Quand choisir Lambda

Lambda est le meilleur choix dans ces scénarios :

  • Traitement événementiel : upload S3 → redimensionnement d'image, message SQS → traitement commande, EventBridge → orchestration de workflow
  • Trafic variable ou sporadique : un webhook qui reçoit 0 requêtes la nuit et 500/seconde lors d'une campagne — Lambda scale de 0 à 500 instantanément
  • Exécution courte : tâches inférieures à 5 minutes (validation, transformation, notification)
  • Intégrations AWS natives : si votre application consomme intensément S3, DynamoDB, SQS, Kinesis — Lambda s'intègre nativement avec une configuration minimale
  • Faible volume : moins de 3 millions de requêtes par mois à 512 MB — Lambda sera moins cher que n'importe quelle configuration Fargate

Quand choisir ECS Fargate

  • Processus long-running : tâches batch de plusieurs heures, serveurs d'inférence ML actifs en permanence, jobs ETL volumineux
  • WebSockets et gRPC : connexions longue durée incompatibles avec le modèle Lambda (timeout 15 min, pas de connexions persistantes)
  • Mémoire supérieure à 10 GB : Lambda est limité à 10 GB ; Fargate monte à 120 GB par tâche
  • Trafic continu prévisible : une API qui reçoit 50 req/s en permanence — Fargate avec Savings Plans sera plus économique que Lambda
  • Images Docker existantes : si vous avez déjà une image Docker bien optimisée, Fargate vous évite de réécrire le code en fonctions Lambda

Analyse de coût : point d'inflexion

Pour un workload typique (512 MB de RAM, 500 ms de durée moyenne), le point d'inflexion où Fargate devient moins cher que Lambda se situe autour de 3 millions d'invocations par mois pour du trafic soutenu :

# Lambda (512 MB, 500ms, 3M invocations/mois)
Compute  : 3M × 0.5s × 0.0000000083 $/GB-s × 0.5 = 0.62 $
Requêtes : 3M × 0.0000002 $                       = 0.60 $
Total Lambda : ~1.22 $/mois

# Fargate (0.25 vCPU, 0.5 GB, 1 tâche 24h/24)
vCPU    : 0.25 × 0.04048 $/h × 730h = 7.39 $
Mémoire : 0.5  × 0.004445 $/h × 730h = 1.62 $
Total Fargate : ~9.01 $/mois

→ Lambda 7x moins cher pour 3M req/mois sporadiques

# Si le trafic est continu (3M req/mois = ~1.15 req/s en continu)
# Lambda reste moins cher jusqu'à ~30M req/mois à ce niveau de ressources
# Au-delà, Fargate Savings Plans (1 an) : -20% sur le compute
# Fargate devient compétitif à partir de ~50M req/mois

Lambda avec des images conteneurs : le meilleur des deux mondes

Depuis 2020, Lambda supporte les images de conteneurs ECR jusqu'à 10 GB. Cela permet de déployer des dépendances système complexes (ffmpeg, pandoc, bibliothèques ML) tout en conservant le modèle de facturation Lambda. C'est souvent la solution optimale pour les fonctions avec des dépendances lourdes :

# Dockerfile pour Lambda avec image conteneur
FROM public.ecr.aws/lambda/python:3.12

# Installer des dépendances système (impossible avec Lambda ZIP classique)
RUN dnf install -y ffmpeg     && dnf clean all

COPY requirements.txt .
RUN pip install -r requirements.txt --no-cache-dir

COPY src/ ${LAMBDA_TASK_ROOT}/

CMD ["handler.lambda_handler"]

# Build et push vers ECR
aws ecr get-login-password | docker login --username AWS --password-stdin $ECR_URI
docker build -t my-lambda .
docker tag my-lambda:latest $ECR_URI/my-lambda:latest
docker push $ECR_URI/my-lambda:latest

Architecture pratique : Lambda + Fargate ensemble

Dans la plupart des architectures modernes, Lambda et Fargate jouent des rôles complémentaires :

# Architecture typique d'une application SaaS

API Gateway → ECS Fargate (API REST synchrone, 200 req/s)
              └── RDS PostgreSQL (connexions persistantes via pool)

S3 Events   → Lambda (traitement asynchrone des fichiers uploadés)
SQS Queue   → Lambda (traitement des jobs en file d'attente)
EventBridge → Lambda (orchestration cron et workflows)

ECS Fargate → tâches batch nocturnes (scheduled tasks, durée 2h+)
ECS Fargate → service WebSocket (chat temps réel, connexions longues)

Exemple Terraform : Lambda + ECS Task Definition

# Lambda function avec rôle IAM minimal
resource "aws_lambda_function" "order_processor" {
  function_name = "order-processor"
  runtime       = "python3.12"
  handler       = "handler.lambda_handler"
  filename      = "function.zip"
  timeout       = 300  # 5 minutes
  memory_size   = 512

  role = aws_iam_role.lambda_exec.arn

  environment {
    variables = {
      TABLE_NAME = aws_dynamodb_table.orders.name
      QUEUE_URL  = aws_sqs_queue.notifications.url
    }
  }
}

# ECS Task Definition pour l'API principale
resource "aws_ecs_task_definition" "api" {
  family                   = "api-production"
  network_mode             = "awsvpc"
  requires_compatibilities = ["FARGATE"]
  cpu                      = "512"   # 0.5 vCPU
  memory                   = "1024"  # 1 GB

  execution_role_arn = aws_iam_role.ecs_execution.arn
  task_role_arn      = aws_iam_role.ecs_task.arn

  container_definitions = jsonencode([{
    name      = "api"
    image     = "${aws_ecr_repository.api.repository_url}:latest"
    essential = true
    portMappings = [{
      containerPort = 8080
      protocol      = "tcp"
    }]
    logConfiguration = {
      logDriver = "awslogs"
      options = {
        "awslogs-group"  = "/ecs/api-production"
        "awslogs-region" = "eu-west-1"
        "awslogs-stream-prefix" = "api"
      }
    }
  }])
}

Conclusion

Il n'existe pas de "meilleur" service entre Lambda et ECS Fargate — il existe le service adapté au contexte. Lambda pour les événements courts, sporadiques et les intégrations AWS natives. Fargate pour les processus longs, les connexions persistantes et les workloads à trafic soutenu. La grande majorité des architectures de production modernes utilisent les deux : Lambda gère les événements et les webhooks, Fargate porte les APIs synchrones critiques et les workers long-running. Adoptez cette complémentarité plutôt que de forcer un seul paradigme sur toute l'application.

← Retour au blog