déployer une application next.js sur aws lambda avec terraform et github actions
28/11/2025
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
curlouPostman. - 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.

