Tous les projets

Déploiement d’un site web statique sur AWS avec CI/CD (S3 + CloudFront)

Site portfolio rapide, sécurisé et peu coûteux, hébergé sur Amazon S3, diffusé par Amazon CloudFront et mis à jour automatiquement avec GitHub Actions.

Date
13 octobre 2026
Site
nicktechs.com
Code source
sitewebstatics3
Auteur
Eyanam TCHALIM

Contexte et objectifs

Ce projet décrit la conception, le déploiement et l’optimisation d’un site web statique sur AWS. Il a été conçu pour créer un site portfolio rapide, sécurisé et facile à maintenir. Il s’agit de https://nicktechs.com.

Le nom de domaine nicktechs.com a été acquis pour ce site. Le besoin impose une architecture simple et peu coûteuse, un accès sécurisé en HTTPS, des frais d’exploitation minimaux et une gestion simplifiée des mises à jour.

Objectifs :

Architecture

Les visiteurs atteignent le site par Route 53 et CloudFront ; le contenu est stocké dans S3 et mis à jour par un pipeline GitHub Actions.

Les requêtes des utilisateurs sont acheminées via Route 53 vers une distribution CloudFront, qui diffuse le contenu mis en cache depuis un compartiment S3. ACM fournit le certificat SSL utilisé pour la diffusion HTTPS via CloudFront.

Le site est construit en HTML. Les mises à jour sont préparées localement et versionnées dans GitHub avant leur déploiement sur AWS.

Schéma d’architecture : des utilisateurs interrogent Route 53, qui renvoie vers CloudFront. CloudFront utilise Certificate Manager et lit un compartiment S3. Un développeur pousse son code vers GitHub, dont le pipeline synchronise S3 et invalide le cache CloudFront.
Figure 1 – Architecture du projet : Route 53, CloudFront, S3, ACM et pipeline CI/CD
En haut, la diffusion du site : visiteur, Route 53, CloudFront et S3 privé, avec ACM. En bas, la livraison continue : développeur, GitHub Actions, secrets GitHub et utilisateur IAM, qui synchronise S3 et invalide le cache CloudFront.
Figure 2 – Vue détaillée : diffusion du site (en haut) et livraison continue (en bas)

Flux d’une requête

  1. Le visiteur saisit nicktechs.com ; Route 53 renvoie l’adresse de la distribution CloudFront.
  2. La connexion HTTPS s’établit avec CloudFront, avec le certificat fourni par ACM.
  3. Si le fichier demandé est en cache, CloudFront le renvoie immédiatement.
  4. Sinon, CloudFront le lit dans le compartiment S3, le met en cache puis le renvoie au visiteur.

Flux de mise à jour

  1. Le développeur modifie le site localement et exécute git push vers GitHub.
  2. GitHub Actions déclenche le workflow de déploiement.
  3. Le workflow s’authentifie auprès d’AWS avec l’identité IAM.
  4. Il synchronise les fichiers vers S3 (aws s3 sync).
  5. Il invalide le cache CloudFront pour que la nouvelle version soit visible immédiatement.

Services AWS utilisés

Le site repose sur cinq services AWS, auxquels s’ajoute GitHub pour le code et l’automatisation.

ServiceRôle dans le projetRéglage clé
Amazon S3Stockage des fichiers HTML et CSS du siteCompartiment privé, lu uniquement par CloudFront (OAC)
Amazon CloudFrontDiffusion mondiale, cache et HTTPSRedirection de HTTP vers HTTPS, certificat ACM, objet racine index.html
Amazon Route 53DNS et gestion du domaineZone hébergée nicktechs.com, enregistrements alias vers CloudFront
AWS Certificate Manager (ACM)Certificat SSL/TLS pour HTTPSCertificat public pour nicktechs.com, créé en us-east-1 (obligatoire pour CloudFront)
AWS IAMDroits du déploiement automatiséIdentité dédiée, limitée au compartiment du site et à l’invalidation CloudFront
GitHub et GitHub ActionsDépôt du code, versionnement et pipelineDépôt sitewebstatics3, déploiement à chaque push sur la branche principale

Sécurité

La sécurité repose sur le chiffrement HTTPS, un accès au stockage réservé à CloudFront et des droits de déploiement limités au strict nécessaire.

Chiffrement et accès

Droits de déploiement

Le pipeline utilise une identité IAM dédiée, dont les droits sont limités au compartiment du site et à l’invalidation du cache CloudFront.

Fiabilité et performance

Il n’y a aucun serveur à maintenir : la disponibilité et la performance reposent sur les services gérés S3, CloudFront et Route 53.

DomaineMécanisme
DiffusionCloudFront sert le contenu depuis ses points de présence les plus proches du visiteur, avec mise en cache
CacheLes fichiers sont servis depuis le cache de CloudFront ; S3 n’est sollicité que lorsqu’un fichier est absent du cache ou invalidé.
Contenu légerLe site est en HTML et CSS statiques, sans traitement côté serveur, ce qui limite le temps de chargement.
StockageS3 Standard conserve les objets de façon redondante dans plusieurs zones de disponibilité
DNSRoute 53 est un service DNS géré, sans serveur à exploiter
Mises à jourInvalidation du cache après chaque déploiement : la nouvelle version est visible rapidement
RestaurationLe site est versionné dans GitHub : revenir à une version précédente consiste à annuler un commit puis à pousser, ce qui relance le déploiement

Mise en œuvre

La mise en place suit sept étapes ; ensuite, chaque mise à jour du site se déploie par un simple git push.

  1. Acquérir le nom de domaine nicktechs.com et créer la zone hébergée Route 53.
  2. Créer le compartiment S3 du site, avec l’accès public bloqué.
  3. Demander dans ACM, en région us-east-1, un certificat pour nicktechs.com.
  4. Créer la distribution CloudFront : origine S3 avec Origin Access Control, redirection de HTTP vers HTTPS, certificat ACM, objet racine index.html.
  5. Créer l’enregistrement alias Route 53 (nicktechs.com) vers la distribution.
  6. Créer l’utilisateur IAM de déploiement avec la politique limitée de la section Sécurité, puis enregistrer ses clés et l’identifiant de la distribution dans les secrets du dépôt GitHub.
  7. Ajouter le workflow de déploiement dans .github/workflows/ du dépôt.

Workflow GitHub Actions

Le workflow se déclenche à chaque push sur main, synchronise les fichiers vers S3, puis invalide le cache CloudFront.

deploy.yml
name: Deploy static website to AWS S3

on:
  push:
    branches: [main]

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

      - uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: us-east-1

      - name: Synchroniser le site vers S3
        run: |
          aws s3 sync . s3://nicktech --delete \
            --exclude ".git/*" --exclude ".github/*"

      - name: Invalider le cache CloudFront
        run: |
          aws cloudfront create-invalidation \
            --distribution-id ${{ secrets.CLOUDFRONT_DISTRIBUTION_ID }} \
            --paths "/*"

Les exclusions évitent d’envoyer le dossier .git (historique) et le dossier .github (workflows) dans un compartiment qui sert un site public. Vérifiez les versions actuelles des actions dans leur documentation avant de figer le workflow.

Mettre à jour le site

Après modification des fichiers en local :

Terminal
git add .
git commit -m "Mise à jour du site"
git push origin main

Le déploiement démarre automatiquement ; son déroulement se suit dans l’onglet Actions du dépôt GitHub.

Coûts et optimisation

En fonctionnement normal, le site coûte environ 1,60 $ par mois, dont les deux tiers pour le nom de domaine ; CloudFront, S3 et ACM sont pratiquement gratuits à ce niveau de trafic.

Estimation des coûts

Hypothèses : région us-east-1, 10 000 visites par mois, site de 50 Mo, 2 Mo transférés par visite (soit 20 Go par mois), tarifs à la demande relevés le 13 octobre 2026. Les volumes de trafic sont une hypothèse de travail.

PosteCalculEstimation mensuelle
S3 : stockage et requêtes50 Mo à 0,023 $/Go, plus quelques centaines de requêtes d’envoi à 0,005 $ les 1 000moins de 0,01 $
CloudFront : transfert et requêtes20 Go et environ 100 000 requêtes, dans l’offre gratuite permanente (1 To et 10 millions de requêtes)0 $
Invalidations CloudFrontUn chemin par déploiement, 1 000 chemins gratuits par mois0 $
Route 53 : zone hébergée0,50 $ par zone et par mois0,50 $
Route 53 : requêtes DNS0,40 $ le million ; les requêtes alias vers CloudFront ne sont pas facturéesmoins de 0,05 $
ACM : certificat publicGratuit avec CloudFront0 $
Nom de domaineEnviron 13 $ par an pour un .com, selon le registraireenviron 1,08 $
Total mensuelenviron 1,60 $

Le trafic devrait dépasser environ 500 000 visites par mois (à 2 Mo chacune) avant de sortir de l’offre gratuite permanente de CloudFront. Au-delà, le transfert sortant est facturé environ 0,085 $ par Go dans la première tranche.

Coûts non inclus : journaux d’accès CloudFront, versioning S3, alarmes CloudWatch. Les tarifs proviennent des pages tarifaires et de la documentation d’AWS, complétées par des sources tierces pour S3 et le prix du domaine ; à confirmer avec l’AWS Pricing Calculator.

Suivi des coûts

Solutions de réduction, avec leur compromis

LevierEffetCompromis
Optimiser les images (WebP, dimensions adaptées) et minifier le CSSMoins de données transférées, pages plus rapidesUne étape de préparation avant le déploiement
Activer la compression de CloudFront (Brotli, gzip)Réduit le volume transféré pour les fichiers texteAucun compromis notable
Cache long sur les fichiers versionnésMoins de requêtes vers S3, pages plus rapidesRenommer les fichiers à chaque changement, ou invalider
Une seule invalidation « /* » par déploiementReste dans les 1 000 chemins gratuits par moisLe cache est vidé en entier après chaque déploiement
Classe de prix CloudFrontRéduit le tarif unitaire en excluant les sites de diffusion les plus chersLatence plus élevée hors Amérique du Nord et Europe ; sans effet tant que le trafic reste dans l’offre gratuite
Règle de cycle de vie S3 sur les anciennes versions (si le versioning est activé)Évite l’accumulation d’anciennes versions payantesHistorique limité à la durée choisie
Ne pas ajouter AWS WAFÉvite environ 6 $ par mois (5 $ la Web ACL et 1 $ par règle), soit plus que le coût total du sitePas de filtrage applicatif, peu utile sur un site statique sans formulaire

Compromis coût et simplicité

Une architecture S3 et CloudFront ramène les coûts fixes à la zone Route 53 et au nom de domaine : il n’y a ni instance à payer en continu, ni serveur à administrer. Le compromis est l’absence de traitement côté serveur : un formulaire de contact ou une fonction dynamique demanderait de compléter l’architecture, par exemple avec API Gateway et Lambda.

Résultats

Le site est en production à l’adresse https://nicktechs.com avec un déploiement automatisé ; les constats ci-dessous reposent sur la description du projet.

Point vérifiéConstatSource
Site en productionAccessible sur https://nicktechs.comDescription du projet
HTTPSCertificat ACM servi par CloudFrontDescription du projet
DéploiementAutomatisé avec GitHub Actions à chaque push sur la branche principaleDescription du projet et workflow
Droits de déploiementLimités au compartiment S3 et à l’invalidation CloudFrontDescription du projet
Code sourceDépôt GitHub sitewebstatics3github.com/eyanamt/sitewebstatics3
Coût estiméEnviron 1,60 $ par mois (estimation, pas une facture)Section Coûts et optimisation

Enseignements et évolutions

Le projet atteint son objectif d’un site rapide, sécurisé et peu coûteux ; sept pistes permettent de le durcir et de l’industrialiser.

Enseignements

Pistes d’amélioration

PisteIntérêt
Remplacer les clés d’accès par un rôle IAM assumé via OpenID Connect (OIDC), limité au dépôt et à la branche principaleSupprime les clés de longue durée stockées dans GitHub ; correspond au rôle limité visé par la description du projet
Ajouter des en-têtes de sécurité (HSTS, X-Content-Type-Options, Content-Security-Policy) avec une Response Headers Policy CloudFrontDurcit le site sans serveur supplémentaire
Activer le versioning S3, avec une règle de cycle de viePermet de restaurer un fichier supprimé ou écrasé
Mettre en place AWS Budgets avec alerteDétecte immédiatement une dérive de coût
Ajouter des contrôles qualité au pipeline (liens cassés, audit Lighthouse)Détecte les défauts avant la mise en ligne
Décrire l’infrastructure avec TerraformPermet de rendre l’ensemble reproductible
Ajouter un environnement de préproductionPermet de tester une modification avant de la publier