Créer un AWS CloudFront en mode Pay-as-You-Go (et non le Plan Gratuit)

Créez un CloudFront pay-as-you-go via l'AWS CLI.

Sommaire

Le plan gratuit d’AWS ne fonctionne pas pour moi et
Pay-as-you-go est caché pour de nouvelles distributions CloudFront sur le tableau de bord AWS .

Lorsque vous hébergez des sites basés sur Hugo sur AWS, vous placez généralement le bucket derrière CloudFront et vous attachez une fonction Lambda@Edge afin que les requêtes vers des chemins de répertoire (p. ex. /blog/) soient réécrites en /blog/index.html pour les origines de type site S3. Vous pouvez ensuite utiliser hugo deploy ou déployer avec l’AWS CLI pour synchroniser le site construit. Le hic : vous avez besoin d’une distribution CloudFront utilisant cette Lambda, et si vous souhaitez éviter les engagements de plans à tarif fixe, le pay-as-you-go. Le tableau de bord ne vous permet plus de choisir cela – uniquement les plans Free ou Pro.

La documentation ne correspond pas aux livraisons réelles

Cet article explique comment créer une distribution pay-as-you-go en réutilisant la configuration d’une distribution existante via l’AWS CLI et les scripts du dossier scripts de cet article.

Quand le tableau de bord ne propose que Free ou Pro

Amazon a introduit des plans de tarification à tarif fixe pour CloudFront (Free, Pro, Business, Premium) qui regroupent le CDN avec WAF, la protection contre les attaques DDoS, Route 53 et d’autres services pour un prix mensuel fixe sans dépassements. Dans le tableau de bord CloudFront, lors de la création d’une nouvelle distribution, vous ne voyez maintenant que les options Free ou Pro (et supérieures). Le plan Pro commence à 15 $ par mois ; il n’y a pas d’option pay-as-you-go visible là-bas.

Le pay-as-you-go reste le mode par défaut lors de la création d’une distribution via l’API CloudFront ou l’AWS CLI (create-distribution). Donc, si vous avez déjà une distribution créée précédemment (ou via CLI) et que vous souhaitez en créer une autre avec le même comportement – par exemple, origine S3 site web plus Lambda@Edge pour index.html – vous pouvez exporter la configuration de cette distribution, l’ajuster et créer une nouvelle distribution. La nouvelle sera pay-as-you-go sauf si vous la rattachez plus tard à un plan à tarif fixe.

Ce dont vous avez besoin

  • Une distribution CloudFront existante dont vous pouvez copier la configuration (par exemple, une utilisée pour un autre site Hugo, ou créée avant le changement du tableau de bord).
  • AWS CLI installé et configuré avec des identifiants pouvant exécuter cloudfront:GetDistributionConfig et cloudfront:CreateDistribution.
  • jq (ou similaire) pour modifier le fichier JSON de configuration.

Les exemples de scripts utilisés ci-dessous se trouvent dans le dossier scripts de cet article : current-distribution-config.json, new-distribution-config.json, updated-distribution-config.json et final-distribution-config.json.

Étape 1 : Obtenir la configuration de la distribution existante

Obtenez la configuration complète de la distribution (y compris ETag) et enregistrez-la :

# Remplacez ABCDEFG par l'ID de votre distribution existante
aws cloudfront get-distribution-config --id ABCDEFG > current-distribution-config.json

get-distribution-config retourne un objet enveloppe avec ETag et DistributionConfig. Pour créer une nouvelle distribution, vous ne passez que l’objet interne DistributionConfig, donc nous l’extrayons :

jq '.DistributionConfig' < current-distribution-config.json > new-distribution-config.json

À ce stade, new-distribution-config.json ressemble à ce qui suit (abrégé). Il inclut CallerReference, Aliases, Origins, DefaultRootObject, et DefaultCacheBehavior avec Lambda@Edge. Pour le domaine du site d’exemple, j’ai utilisé micro.com :

{
  "CallerReference": "8b2b19eb-6d41-4fc0-8d04-a1313e23e2d7",
  "Aliases": {
    "Quantity": 1,
    "Items": ["micro.com"]
  },
  "DefaultRootObject": "index.html",
  "Origins": {
    "Quantity": 1,
    "Items": [
      {
        "Id": "micro.com.s3.us-west-2.amazonaws.com",
        "DomainName": "micro.com.s3-website-us-west-2.amazonaws.com",
        "OriginPath": "",
        "CustomOriginConfig": {
          "HTTPPort": 80,
          "HTTPSPort": 443,
          "OriginProtocolPolicy": "http-only"
        }
      }
    ]
  },
  "DefaultCacheBehavior": {
    "TargetOriginId": "micro.com.s3.us-west-2.amazonaws.com",
    "ViewerProtocolPolicy": "redirect-to-https",
    "LambdaFunctionAssociations": {
      "Quantity": 1,
      "Items": [
        {
          "LambdaFunctionARN": "arn:aws:lambda:us-east-1:...your-lambda-arn",
          "EventType": "origin-request",
          "IncludeBody": false
        }
      ]
    }
  }
}

Étape 2 : Définir un CallerReference unique

Chaque distribution doit avoir un unique CallerReference. Réutiliser la même valeur qu’une autre distribution entraîne le rejet de la requête par l’API. Utilisez une nouvelle chaîne ou un timestamp :

NEW_CALLER_REF="new-distr-$(date +%s)"
jq --arg ref "$NEW_CALLER_REF" '.CallerReference = $ref' new-distribution-config.json > updated-distribution-config.json

Étape 3 : Ajuster les alias et les origines (optionnel)

Si le nouveau site utilise un domaine ou un bucket S3 différent, mettez à jour Aliases et Origins dans updated-distribution-config.json pour correspondre (p. ex. point de terminaison du site web du nouveau bucket et liste d’alias). Si vous souhaitez une distribution sans domaine personnalisé pour l’instant, supprimez les alias :

jq '.Aliases = {"Quantity": 0, "Items": []}' updated-distribution-config.json > final-distribution-config.json

Si vous devez pointer vers un autre point de terminaison de site web S3, modifiez la section Origins dans le même fichier (p. ex. changez Id et DomainName en l’hôte du nom de domaine du nouveau bucket, et définissez DefaultCacheBehavior.TargetOriginId sur le même Id).

Étape 4 : Créer la nouvelle distribution

Créez la distribution à partir de la configuration finale :

aws cloudfront create-distribution --distribution-config file://final-distribution-config.json

La réponse inclut l’Id, l’ARN, le DomainName et le Status de la nouvelle distribution. La nouvelle distribution utilise par défaut le pay-as-you-go. Vous pouvez ensuite pointer votre DNS (ou Route 53) vers le nouveau domaine CloudFront et, si vous l’utilisez pour Hugo, déployez avec Hugo deploy ou AWS CLI comme d’habitude.

Référence rapide : script complet

Collé ensemble (en utilisant un ID de distribution existant et en supprimant les alias), le flux est :

# 1) Exporter et extraire DistributionConfig
aws cloudfront get-distribution-config --id EABCDEFGZ > current-distribution-config.json
jq '.DistributionConfig' < current-distribution-config.json > new-distribution-config.json

# 2) CallerReference unique
NEW_CALLER_REF="new-distr-$(date +%s)"
jq --arg ref "$NEW_CALLER_REF" '.CallerReference = $ref' new-distribution-config.json > updated-distribution-config.json

# 3) Optionnel : sans domaine personnalisé
jq '.Aliases = {"Quantity": 0, "Items": []}' updated-distribution-config.json > final-distribution-config.json

# 4) Créer (pay-as-you-go) distribution
aws cloudfront create-distribution --distribution-config file://final-distribution-config.json

Pay-as-you-go vs. tarif fixe (rappel)

  • Pay-as-you-go : Vous payez pour la sortie de données et les requêtes ; le niveau gratuit permanent de CloudFront inclut 1 TB de transfert de données et 10 millions de requêtes HTTP/HTTPS par mois. Aucun frais mensuel.
  • Plans à tarif fixe : Documentés ici. Le plan gratuit a des limites plus basses (p. ex. 1 million de requêtes, 100 Go) ; le plan Pro commence à 15 $ par mois avec plus de capacité et des services regroupés tels que WAF, Route 53, etc. Aucun dépassement.

Si votre trafic s’inscrit dans la tranche gratuite de pay-as-you-go et que vous n’avez pas besoin des fonctionnalités regroupées des plans à tarif fixe, la création de distributions via l’AWS CLI comme indiqué ci-dessus vous maintient sur le mode pay-as-you-go alors que le tableau de bord ne montre que Free/Pro.

Liens utiles