blog post

Architecture type - Static Website sur AWS

author image

Les sites web statiques connaissent un regain d’intérêt dans le monde du DevOps et du Cloud. Pourquoi ? Parce qu’ils offrent des performances exceptionnelles, une scalabilité quasi-illimitée et des coûts d’exploitation réduits. Dans cet article, nous allons détailler une architecture type sur AWS utilisant S3, CloudFront et Route 53.

Pour quels types de sites cette infrastructure convient-elle ?

Avant de plonger dans l’architecture, identifions les cas d’usage optimaux pour cette infrastructure :

Sites parfaitement adaptés :

  • Sites corporate et vitrine : présentation d’entreprise, landing pages
  • Documentation technique : sites générés par Hugo, Jekyll, MkDocs, Docusaurus
  • Blogs et sites de contenu : sites statiques générés (Gatsby, Next.js en mode export)
  • Single Page Applications (SPA) : React, Vue, Angular buildées en statique
  • Sites de portfolio : CVs en ligne, portfolios de designers/développeurs
  • Cartes de restaurant en ligne : menus numériques, cartes QR code
  • CVs et profils professionnels : pages de présentation personnelle
  • Sites événementiels : pages temporaires pour conférences, événements

Avantages techniques :

  • Aucun serveur à maintenir (serverless)
  • Scalabilité automatique sans limite
  • Latence ultra-faible grâce au CDN global
  • Coûts prévisibles et optimisés
  • Haute disponibilité native (99,99%)
  • Sécurité renforcée (pas de backend à compromettre)

Limitations à considérer :

  • Pas de contenu dynamique côté serveur (pas de PHP, Python, etc.)
  • Pas de base de données traditionnelle
  • Pas de gestion de sessions utilisateur côté serveur
  • Formulaires nécessitant des services tiers (API Gateway + Lambda, ou services externes)

Tip

Cette architecture est idéale pour les sites nécessitant une disponibilité élevée avec un minimum d’opérations. Le temps de déploiement est quasi instantané et le rollback trivial (copie S3).

Architecture détaillée

Voici le schéma d’architecture que nous allons mettre en place :

Architecture AWS Site Statique

Flux de requête

  1. Utilisateur → Route 53 : Résolution DNS du nom de domaine
  2. Route 53 → CloudFront : Redirection vers la distribution CloudFront
  3. CloudFront → Certificate Manager : Validation du certificat SSL/TLS
  4. CloudFront → S3 : Récupération du contenu statique depuis le bucket source
  5. S3 → S3 Logs : Écriture des logs d’accès S3 pour analyse

Composants de l’infrastructure

S3 Static Website Hosting

Amazon S3 est le socle de notre architecture. Configuration recommandée :

Bucket principal :

Nom : votredomaine.com
Région : eu-west-1 (ou la plus proche de vos utilisateurs)
Versioning : Activé (pour rollback facile)
Encryption : AES-256 (SSE-S3)
Block Public Access : Désactivé uniquement pour CloudFront

Politique de bucket : Le bucket doit autoriser CloudFront via OAI (Origin Access Identity) ou OAC (Origin Access Control, recommandé depuis 2022).

Warning

Sécurité : Ne rendez JAMAIS le bucket S3 public. Utilisez systématiquement CloudFront avec OAC pour contrôler l’accès. Cela évite les accès directs au bucket et force le passage par le CDN.

CloudFront CDN

CloudFront assure la distribution du contenu avec une latence minimale.

Configuration clé :

  • Edge Locations : Plus de 400 points de présence dans le monde
  • Price Class : Choisir selon votre audience (All, 200, 100)
  • Cache Behavior :
    • TTL par défaut : 86400s (24h)
    • TTL minimum : 0s (pour assets dynamiques)
    • TTL maximum : 31536000s (1 an pour assets versionnés)
  • Compression : Activée (Gzip, Brotli)
  • HTTP vers HTTPS : Redirect automatique
  • HTTP/2 : Activé
  • IPv6 : Activé

Optimisations performances :

Cache-Control: public, max-age=31536000, immutable  # Pour JS/CSS versionnés
Cache-Control: public, max-age=3600                 # Pour HTML
Cache-Control: no-cache                             # Pour index.html

Les invalidations CloudFront sont limitées à 1000 paths gratuits par mois. Au-delà : 0,005$ par path.

Stratégie recommandée :

  • Versionnez vos assets (app.a1b2c3d.js)
  • Invalidez uniquement les fichiers HTML
  • Utilisez des wildcards avec parcimonie (coût identique à 1000 fichiers individuels)

Exemple de commande d’invalidation :

aws cloudfront create-invalidation \
  --distribution-id E1234ABCD \
  --paths "/index.html" "/*.html"

Route 53

Service DNS managé d’AWS pour la résolution de noms de domaine.

Configuration :

  • Hosted Zone : Zone hébergée publique pour votre domaine
  • Record A (Alias) : Pointe vers la distribution CloudFront
  • Record AAAA (Alias) : Pour IPv6 vers CloudFront
  • TTL : 300s (5 minutes) pour la flexibilité

Avantages Route 53 :

  • Intégration native avec CloudFront
  • Health checks disponibles
  • Routing policies avancées (latency, geolocation, weighted)
  • DNS failover automatique

Certificate Manager (ACM)

Gestion des certificats SSL/TLS gratuits pour HTTPS.

Points importants :

  • Certificats gratuits tant qu’ils sont utilisés avec des services AWS
  • Renouvellement automatique
  • Support des certificats wildcard (*.votredomaine.com)
  • Validation par DNS (recommandée) ou email

Warning

Région critique : Pour CloudFront, le certificat ACM doit être créé dans la région us-east-1 (N. Virginia), même si votre infrastructure est ailleurs. C’est une contrainte AWS pour les distributions CloudFront globales.

S3 Access Logs

Bucket secondaire pour stocker les logs d’accès du bucket S3 principal.

Configuration du bucket de logs :

Nom : votredomaine-logs
Lifecycle Policy :
  - Suppression après 365 jours

Estimation des coûts

Voici une estimation des coûts mensuels pour un site typique (5 000 visiteurs/mois, 50 MB, 3 pages par visite) :

ServiceCoût mensuelCoût annuel
S3 Storage~0,01 $~0,12 $
CloudFront~0,65 $~7,80 $
Route 530,50 $6,00 $
Certificate ManagerGratuit*Gratuit*
S3 Logs~0,01 $~0,12 $
TOTAL~1,20 $~14,40 $

*Gratuit tant que le certificat est utilisé avec des services AWS intégrés (CloudFront, ALB, API Gateway)

Tip

Retour d’expérience réel : En production pour un site corporate standard (5 000 visiteurs/mois), les coûts se situent entre 2-3 $/mois, incluant tous les services.

Trafic mensuelS3CloudFrontRoute 53Total mensuelTotal annuel
5 000 visiteurs~0,01 $~0,65 $0,50 $~1,20 $~14,40 $
50 000 visiteurs~0,05 $~6,50 $0,50 $~7 $~84 $
200 000 visiteurs~0,10 $~25 $0,50 $~26 $~312 $

Automatisation via CI/CD

L’automatisation du déploiement est essentielle pour une approche DevOps moderne. Voici des exemples d’intégration CI/CD.

stages:
  - build
  - deploy
  - invalidate

variables:
  S3_BUCKET: "votredomaine.com"
  CLOUDFRONT_DISTRIBUTION_ID: "E1234ABCD"

build:
  stage: build
  image: node:18
  script:
    - npm install
    - npm run build
  artifacts:
    paths:
      - dist/
    expire_in: 1 hour
  only:
    - main

deploy_s3:
  stage: deploy
  image: amazon/aws-cli:latest
  script:
    - aws s3 sync dist/ s3://${S3_BUCKET}/
      --delete
      --cache-control "public,max-age=31536000,immutable"
      --exclude "*.html"
    - aws s3 sync dist/ s3://${S3_BUCKET}/
      --exclude "*"
      --include "*.html"
      --cache-control "public,max-age=3600"
  dependencies:
    - build
  only:
    - main

invalidate_cloudfront:
  stage: invalidate
  image: amazon/aws-cli:latest
  script:
    - aws cloudfront create-invalidation
      --distribution-id ${CLOUDFRONT_DISTRIBUTION_ID}
      --paths "/*.html" "/index.html"
  dependencies:
    - deploy_s3
  only:
    - main
name: Deploy to AWS

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: '18'

      - name: Build
        run: |
          npm install
          npm run build

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v2
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: eu-west-1

      - name: Deploy to S3
        run: |
          aws s3 sync dist/ s3://votredomaine.com/ --delete

      - name: Invalidate CloudFront
        run: |
          aws cloudfront create-invalidation \
            --distribution-id ${{ secrets.CLOUDFRONT_DISTRIBUTION_ID }} \
            --paths "/*.html" "/index.html"
# S3 Bucket
resource "aws_s3_bucket" "website" {
  bucket = "votredomaine.com"
}

resource "aws_s3_bucket_website_configuration" "website" {
  bucket = aws_s3_bucket.website.id

  index_document {
    suffix = "index.html"
  }

  error_document {
    key = "404.html"
  }
}

# CloudFront Distribution
resource "aws_cloudfront_distribution" "website" {
  enabled             = true
  is_ipv6_enabled     = true
  default_root_object = "index.html"
  aliases             = ["votredomaine.com", "www.votredomaine.com"]

  origin {
    domain_name = aws_s3_bucket.website.bucket_regional_domain_name
    origin_id   = "S3-${aws_s3_bucket.website.id}"

    s3_origin_config {
      origin_access_identity = aws_cloudfront_origin_access_identity.website.cloudfront_access_identity_path
    }
  }

  default_cache_behavior {
    allowed_methods  = ["GET", "HEAD", "OPTIONS"]
    cached_methods   = ["GET", "HEAD"]
    target_origin_id = "S3-${aws_s3_bucket.website.id}"

    forwarded_values {
      query_string = false
      cookies {
        forward = "none"
      }
    }

    viewer_protocol_policy = "redirect-to-https"
    min_ttl                = 0
    default_ttl            = 3600
    max_ttl                = 86400
    compress               = true
  }

  viewer_certificate {
    acm_certificate_arn      = aws_acm_certificate.website.arn
    ssl_support_method       = "sni-only"
    minimum_protocol_version = "TLSv1.2_2021"
  }

  restrictions {
    geo_restriction {
      restriction_type = "none"
    }
  }
}

# Route 53
resource "aws_route53_record" "website" {
  zone_id = aws_route53_zone.main.zone_id
  name    = "votredomaine.com"
  type    = "A"

  alias {
    name                   = aws_cloudfront_distribution.website.domain_name
    zone_id                = aws_cloudfront_distribution.website.hosted_zone_id
    evaluate_target_health = false
  }
}

Tip

Conseil DevOps : Utilisez Terraform workspaces pour gérer plusieurs environnements (dev, staging, prod) avec la même configuration IaC. Stockez le state Terraform sur S3 avec DynamoDB pour le locking.

Avantages et limitations

Performance

  • Latence < 50ms grâce au CDN global
  • Time to First Byte (TTFB) optimisé
  • Aucun cold start (contrairement aux Lambda@Edge)

Scalabilité

  • Gère automatiquement les pics de trafic
  • Aucune limite de concurrence
  • Pas de provisioning à prévoir

Fiabilité

  • SLA 99,99% pour S3
  • SLA 99,9% pour CloudFront
  • Multi-AZ par défaut

Sécurité

  • Surface d’attaque minimale
  • AWS Shield Standard inclus (protection DDoS)
  • WAF configurable (optionnel, coût additionnel)
  • Pas de serveur à patcher

Coûts

  • Pay-as-you-go sans engagement
  • Pas de coûts fixes de serveurs
  • Prévisibilité excellente
  • Coûts très faibles (2-3 $/mois pour un site standard)

Contenu dynamique

  • Nécessite des workarounds (Lambda@Edge, API Gateway)
  • Pas de génération de contenu à la demande côté serveur
  • Pas de langages backend (PHP, Python, Ruby)

Latence première visite

  • Cache miss initial sur le edge location
  • Temps de propagation des invalidations (quelques minutes)

Gestion d’état

  • Pas de sessions utilisateur natives
  • Nécessite des solutions externes (Cognito, Auth0)
  • Pas de cookies côté serveur

SEO

  • SSR non disponible nativement (mais pré-rendering possible)
  • Meta tags dynamiques nécessitent un build pour chaque page

Fonctionnalités avancées

  • Formulaires nécessitent des services tiers
  • Authentification requiert des solutions externes
  • Pas de base de données intégrée

Conclusion

Cette architecture S3 + CloudFront + Route 53 représente un pattern éprouvé pour l’hébergement de sites web statiques sur AWS. Elle combine haute performance, scalabilité illimitée et coûts maîtrisés.

Points clés à retenir :

  • Architecture serverless nécessitant zéro maintenance
  • Coûts prévisibles démarrant à ~1$/mois pour les petits sites
  • Automatisation complète via CI/CD
  • Idéal pour sites corporate, documentation, SPA
  • Infrastructure as Code avec Terraform pour la reproductibilité

Tip

Nous accompagnons les entreprises dans la mise en place de cette architecture :

  • Audit et conception de l’infrastructure adaptée à vos besoins
  • Implémentation complète avec Terraform (Infrastructure as Code)
  • Configuration de pipelines CI/CD (GitLab CI, GitHub Actions, Jenkins)
  • Optimisation des coûts et des performances
  • Formation de vos équipes DevOps/SRE
  • Support et maintenance continue

Contactez-nous pour discuter de votre projet d’infrastructure cloud.


Prêt à moderniser votre infrastructure web ? Suivez-nous pour découvrir d’autres architectures types dans les prochains articles.

Articles Liés

Prêt à transformer votre infrastructure ?

Contactez-nous pour discuter de votre projet cloud et découvrir comment nous pouvons vous accompagner dans votre transformation digitale.

Nous contacter