Automatiser le déploiement d’une application Next.js sur AWS Lambda garantit une montée en charge transparente et des coûts maîtrisés. Dans ce tutoriel, vous apprendrez à :

  • Packager votre app Next.js en image Docker
  • Décrire l’infrastructure serverless avec Terraform
  • Orchestrer le pipeline CI/CD avec GitHub Actions

déployer une application next.js sur aws lambda avec terraform et github actions

Prérequis

  • Node.js ≥16 et Next.js ≥12
  • Compte AWS avec AWS CLI configuré
  • Terraform ≥1.3 installé
  • Repository GitHub et secrets AWS_ROLE_ARN, ECR_REGISTRY configurés

1. Préparer l’image Docker de votre app

On part d’une image Lambda Node.js officielle pour limiter la taille :

FROM public.ecr.aws/lambda/nodejs:14
WORKDIR /var/task
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
CMD ["server.handler"]  # Adapté à votre handler

Ensuite, construisez et poussez sur ECR :

docker build -t next-app .
aws ecr create-repository --repository-name my-next-app
aws ecr get-login-password --region eu-west-1 \
  | docker login --username AWS --password-stdin .dkr.ecr.eu-west-1.amazonaws.com
docker tag next-app:latest .dkr.ecr.eu-west-1.amazonaws.com/my-next-app:latest
docker push .dkr.ecr.eu-west-1.amazonaws.com/my-next-app:latest

2. Décrire l’infrastructure avec Terraform

provider "aws" {
  region = "eu-west-1"
}

resource "aws_ecr_repository" "next_app" {
  name = "my-next-app"
}

resource "aws_iam_role" "lambda_exec" {
  name = "lambda_exec_role"
  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [{
      Action    = "sts:AssumeRole"
      Principal = { Service = "lambda.amazonaws.com" }
      Effect    = "Allow"
    }]
  })
}

resource "aws_lambda_function" "next" {
  function_name = "next-app"
  package_type  = "Image"
  image_uri     = "${aws_ecr_repository.next_app.repository_url}:latest"
  role          = aws_iam_role.lambda_exec.arn
}
Erreur fréquente : “AccessDeniedException” → vérifier que aws_iam_role.lambda_exec a la policy LambdaBasicExecutionRole.

3. Pipeline CI/CD avec GitHub Actions

name: Deploy Next.js to AWS Lambda

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '16'
      - name: Install deps & build
        run: |
          npm ci
          npm run build
      - name: Build & push Docker image
        env:
          ECR_REGISTRY: ${{ secrets.ECR_REGISTRY }}
        run: |
          docker build -t next-app .
          docker tag next-app:latest $ECR_REGISTRY/my-next-app:latest
          docker push $ECR_REGISTRY/my-next-app:latest
      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-region: eu-west-1
          role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
      - name: Terraform deploy
        run: |
          cd terraform
          terraform init
          terraform apply -auto-approve

4. Vérification et performance

  • Testez avec curl ou Postman.
  • Cold start moyen : 150–250 ms (Node.js 14).
  • Warm start : ~50 ms. Surveillez avec CloudWatch Logs.

Bonnes pratiques

  • Principe du moindre privilège IAM.
  • Versioning des images Lambda pour déploiement canary.
  • Alertes CloudWatch + tableau de bord Grafana.
  • Optimisation des pages Next.js (compression, code splitting).

Pour approfondir Next.js, rendez-vous sur la page Next.js. Vous souhaitez un accompagnement sur vos pipelines CI/CD et architectures serverless ? Découvrez nos offres application web ou contactez-nous pour en discuter.