Cloud & Déploiement

AWS S3 + CloudFront : héberger un site statique

Aws S3 Cloudfront Cdn Site-Statique Https Route-53 Iam Cloud Hosting-Statique Edge-Locations Cache-Cdn Deploiement Infrastructure-Cloud
AWS S3 + CloudFront : héberger un site statique

Déployez un site statique sur AWS S3 avec distribution CloudFront : configuration HTTPS, politique de cache optimisée et déploiement automatisé en production.

Créer et configurer le bucket S3

S3 (Simple Storage Service) stocke tes fichiers statiques (HTML, CSS, JS, images). On le configure pour servir un site web directement.

Étapes de création

  1. AWS Console → S3 → Create bucket
  2. Nom: mon-site-prod (doit être unique globalement)
  3. Région: us-east-1 (conventionnel pour CloudFront)
  4. Décocher Block all public access (nécessaire pour CloudFront)

Configure la politique de bucket pour autoriser CloudFront:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowCloudFront",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity/ABCDEFG1234567"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::mon-site-prod/*"
    }
  ]
}

Ensuite, configure le site web statique (propriétés du bucket → Static website hosting):

Index document: index.html
Error document: 404.html

Créer la distribution CloudFront

CloudFront est un CDN qui distribue ton contenu dans + de 200 datacenters mondiaux, donc bien plus rapide que S3 seul.

Avantage principal: les utilisateurs récupèrent le contenu d'un serveur proche de leur location, gains de latence énormes.

Crée la distribution:

AWS Console → CloudFront → Create distribution

1. Origin domain: sélectionner le bucket S3
2. Origin access: "Origin access control settings"
   - Créer une OAC (Origin Access Control)

3. Viewer protocol: Redirect HTTP to HTTPS

4. Allowed HTTP methods: GET, HEAD

5. Cache policy: CachingOptimized (défaut)

6. Compress objects automatically: ON

7. Alternate domain names (CNAME):
   monsite.com
   www.monsite.com

Après création, AWS te donne une URL CloudFront: d1234abc.cloudfront.net

Connecter un domaine personnel

Pour que ton site soit accessible via monsite.com au lieu du long URL CloudFront.

Options

  • Avec Route 53 (AWS DNS): facile, intégration native
  • Avec ton registrar (Namecheap, Gandi, etc): crée un CNAME record

Avec Route 53:

AWS Console → Route 53 → Hosted zones

1. Créer hosted zone pour "monsite.com"
2. Créer un record:
   - Type: A (alias)
   - Name: monsite.com
   - Alias target: distribution CloudFront
   - Routing policy: Simple
3. Copier les nameservers Route 53 chez ton registrar

Avec un registrar externe (exemple Namecheap):

1. Aller sur ton registrar
2. Créer CNAME record:
   - Host: www
   - Type: CNAME
   - Value: d1234abc.cloudfront.net

3. Pour l'apex (monsite.com), utiliser ALIAS ou effectuer la redirection www

Gérer le cache et les invalidations

CloudFront met en cache le contenu. C'est performant mais tu dois contrôler l'expiration pour les mises à jour.

Temps de cache par type

  • HTML (index.html) → cache court: 5-60 minutes
  • CSS, JS, images → cache long: 1 an (immutable)

Configure la cache policy pour les fichiers HTML:

Au moment du build, ajoute des headers de cache:

index.html: Cache-Control: max-age=300 (5 min)
*.css, *.js, *.png: Cache-Control: max-age=31536000 (1 an)

Pour invalider manuellem, crée une invalidation CloudFront:

AWS CLI:
aws cloudfront create-invalidation \
  --distribution-id D1234ABC \
  --paths "/*"

Cela force le rafraîchissement de tous les fichiers.

Ou via la console CloudFront → Distributions → Invalidations → Create invalidation

Sécurité et HTTPS

CloudFront inclut HTTPS gratuit avec ACM (AWS Certificate Manager). Active-le obligatoirement en production.

Checklist sécurité:
  • ✓ Certificat SSL/TLS validé (ACM gratuit)
  • ✓ Redirection HTTP → HTTPS obligatoire
  • ✓ CORS configuré si tu as des APIs
  • ✓ Bucket S3 avec "Block all public access" (sauf pour OAC)

Dans CloudFront, ajoute les headers de sécurité via une fonction Lambda@Edge ou via une policy personnalisée:

Headers de sécurité recommandés:

Strict-Transport-Security: max-age=31536000; includeSubDomains
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline'

Déploiement automatisé

À la place de uploader manuellement chaque fichier, automatise le build et déploiement avec GitHub Actions + AWS CLI.

# fichier: .github/workflows/deploy.yml

name: Deploy to AWS

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

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

      - name: Sync to S3
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        run: |
          aws s3 sync dist/ s3://mon-site-prod --delete

      - name: Invalidate CloudFront
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        run: |
          aws cloudfront create-invalidation \
            --distribution-id D1234ABC \
            --paths "/*"

Setup des secrets GitHub

  1. Créer une IAM user AWS avec permissions S3 + CloudFront
  2. Copier Access Key ID et Secret Access Key
  3. Dans GitHub → Settings → Secrets → ajouter AWS_ACCESS_KEY_ID et AWS_SECRET_ACCESS_KEY

Questions fréquentes

Buildez avec `ng build --configuration=production`. Créez un bucket S3, activez l'hébergement de site web statique, et configurez `index.html` comme document d'index et d'erreur (pour le routing Angular). Uploadez avec `aws s3 sync dist/mon-app/ s3://mon-bucket --delete`. Configurez les CORS si nécessaire pour les appels API cross-origin.

CloudFront ajoute : CDN mondial (latence réduite), HTTPS gratuit via ACM (AWS Certificate Manager), compression gzip/brotli, cache edge (moins de requêtes S3 = coût réduit), protection DDoS (AWS Shield Standard inclus), et possibilité d'ajouter des Lambda@Edge pour la réécriture d'URL (SPA routing, A/B testing).

Créez une Custom Error Response dans CloudFront : erreur 403/404 → redirect vers `/index.html` avec code HTTP 200. Cela permet à Angular Router de gérer toutes les routes côté client. Pour S3 seul, configurez le document d'erreur à `index.html` dans les paramètres d'hébergement statique.

Créez une invalidation : `aws cloudfront create-invalidation --distribution-id VOTREDIST --paths "/*"`. Automatisez dans votre CI/CD après le sync S3. Pour éviter les invalidations payantes (les 1000 premières sont gratuites/mois), utilisez des fichiers versionnés (Angular CLI génère des hash dans les noms de fichiers) et n'invalidez que `index.html`.

Partager