Daily Actions: Déployer Next.js sur AWS (export statique) : S3 et CloudFront en 5 minutes avec CDK

Déployer Next.js sur AWS (export statique) : S3 et CloudFront en 5 minutes avec CDK

Héberger une application Next.js en statique sur AWS suit le même schéma : un bucket S3 privé pour les fichiers, CloudFront pour la diffusion globale, et OAC pour verrouiller l’accès direct à S3. Le CDK TypeScript automatise le tout, sans dépendre de Route 53 pour commencer.

Dans ce guide, nous créons une app Next.js en export statique, puis nous déployons la sortie exportée (out/) vers S3 derrière CloudFront en une commande.

Prérequis

Avant de commencer, il vous faut :

BASH
aws configure
Cliquez pour développer et voir plus
BASH
npm install -g aws-cdk
Cliquez pour développer et voir plus

1. Structure du projet

Nous regroupons l’application et l’infrastructure dans un dossier racine unique :

SQL
/host-nextjs-app
├── /frontend          --------------> Application Next.js (export statique)
└── /infrastructure    --------------> Code AWS CDK
Cliquez pour développer et voir plus

Création du dossier et du frontend Next.js

SH
mkdir host-nextjs-app && cd host-nextjs-app
npx create-next-app@latest frontend --typescript --eslint --app
cd frontend && npm install && cd ..
Cliquez pour développer et voir plus

Activer l’export statique Next.js

Modifiez frontend/next.config.js (ou next.config.mjs) et définissez :

JS
/** @type {import('next').NextConfig} */
const nextConfig = {
  output: 'export',
};

module.exports = nextConfig;
Cliquez pour développer et voir plus

Ensuite, lancez :

BASH
cd frontend
npm run build
Cliquez pour développer et voir plus

Next.js générera le site statique dans frontend/out/.

Création de l’infrastructure

SH
mkdir infrastructure && cd infrastructure
cdk init app --language typescript
Cliquez pour développer et voir plus

2. Le code de l’infrastructure (CDK)

Ouvrez infrastructure/lib/infrastructure-stack.ts. Ce stack crée le bucket S3, la distribution CloudFront avec OAC, et le déploiement de l’export statique Next.js (out/). Pour les routes introuvables, on mappe 404 vers 404.html.

TS
import * as cdk from 'aws-cdk-lib/core';
import { Construct } from 'constructs';
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as cloudfront from 'aws-cdk-lib/aws-cloudfront';
import * as s3deploy from 'aws-cdk-lib/aws-s3-deployment';
import * as origins from 'aws-cdk-lib/aws-cloudfront-origins';

export class InfrastructureStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const bucket = new s3.Bucket(this, 'NextAppBucket', {
      removalPolicy: cdk.RemovalPolicy.DESTROY,
      autoDeleteObjects: true,
      blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL,
      bucketName: 'next-daily-app',
    });

    const distribution = new cloudfront.Distribution(this, 'NextAppDistribution', {
      defaultBehavior: {
        origin: origins.S3BucketOrigin.withOriginAccessControl(bucket),
        viewerProtocolPolicy: cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
      },
      defaultRootObject: 'index.html',
      errorResponses: [
        {
          httpStatus: 404,
          responseHttpStatus: 404,
          responsePagePath: '/404.html',
        },
      ],
    });

    // Export statique Next.js : sortie par défaut dans frontend/out
    new s3deploy.BucketDeployment(this, 'DeployNextApp', {
      sources: [s3deploy.Source.asset('../frontend/out')],
      destinationBucket: bucket,
      distribution,
      distributionPaths: ['/*'],
    });

    new cdk.CfnOutput(this, 'DistributionDomainName', {
      value: distribution.domainName,
    });
  }
}
Cliquez pour développer et voir plus

3. Déploiement en une étape

Dans infrastructure/package.json, ajoutez un script qui build le front puis lance le déploiement CDK (chemins relatifs depuis le dossier infrastructure) :

JSON
"deploy:all": "cd ../frontend && npm run build && cd ../infrastructure && cdk deploy"
Cliquez pour développer et voir plus

Puis :

BASH
cd infrastructure
npm run deploy:all
Cliquez pour développer et voir plus

En sortie, récupérez l’URL CloudFront (domaine du type https://xxxxxxxxxxxx.cloudfront.net/) pour ouvrir l’application.

application view

4. Pointer votre domaine (sans Route 53) — bonus

Si votre domaine est chez OVH, GoDaddy ou un autre registrar, créez un enregistrement CNAME :

5. Nettoyer

Pour éviter des coûts après les tests :

SH
cd infrastructure
cdk destroy
Cliquez pour développer et voir plus

Commentaires

Commencer la recherche

Saisissez des mots-clés pour rechercher des articles

↑↓
ESC
⌘K Raccourci