
DynamoDB n'est plus nécessaire pour le verrouillage de state Terraform sur S3
Terraform 1.11 rend obsolète l’utilisation de DynamoDB pour le verrouillage de state S3. Grâce aux écritures …
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.
Avant de plonger dans l’architecture, identifions les cas d’usage optimaux pour cette infrastructure :
Sites parfaitement adaptés :
Avantages techniques :
Limitations à considérer :
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).
Voici le schéma d’architecture que nous allons mettre en place :
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 assure la distribution du contenu avec une latence minimale.
Configuration clé :
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 :
Exemple de commande d’invalidation :
aws cloudfront create-invalidation \
--distribution-id E1234ABCD \
--paths "/index.html" "/*.html"
Service DNS managé d’AWS pour la résolution de noms de domaine.
Configuration :
Avantages Route 53 :
Gestion des certificats SSL/TLS gratuits pour HTTPS.
Points importants :
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.
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
Voici une estimation des coûts mensuels pour un site typique (5 000 visiteurs/mois, 50 MB, 3 pages par visite) :
Service | Coût mensuel | Coût annuel |
---|---|---|
S3 Storage | ~0,01 $ | ~0,12 $ |
CloudFront | ~0,65 $ | ~7,80 $ |
Route 53 | 0,50 $ | 6,00 $ |
Certificate Manager | Gratuit* | 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 mensuel | S3 | CloudFront | Route 53 | Total mensuel | Total 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 $ |
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.
Performance
Scalabilité
Fiabilité
Sécurité
Coûts
Contenu dynamique
Latence première visite
Gestion d’état
SEO
Fonctionnalités avancées
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 :
Tip
Nous accompagnons les entreprises dans la mise en place de cette architecture :
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.
Terraform 1.11 rend obsolète l’utilisation de DynamoDB pour le verrouillage de state S3. Grâce aux écritures …
Vous avez déjà reçu une facture AWS qui vous a fait froid dans le dos ? Vous n’êtes pas seul. La facturation cloud …
Contactez-nous pour discuter de votre projet cloud et découvrir comment nous pouvons vous accompagner dans votre transformation digitale.
Nous contacter