Creare un AWS CloudFront su base Pay-as-You-Go (non il piano gratuito)

Creare CloudFront pay-as-you-go tramite AWS CLI.

Indice

Il piano gratuito di AWS non funziona per me e
Pay-as-you-go è nascosto per nuove distribuzioni CloudFront sulla console AWS.

Quando ospiti siti basati su Hugo su AWS, di solito metti il bucket dietro CloudFront e aggiungi una funzione Lambda@Edge in modo che le richieste ai percorsi di directory (es. /blog/) vengano riscritte in /blog/index.html per le origini del sito web S3. Poi puoi utilizzare hugo deploy o distribuisci con AWS CLI per sincronizzare il sito costruito. L’aspetto negativo: devi creare una distribuzione CloudFront che utilizzi quella Lambda e, se vuoi evitare impegni con piani a tariffa fissa, pay-as-you-go. La console non ti permette più di scegliere solo piani Gratuiti o Pro.

La documentazione non corrisponde alle consegne effettive

Questo post mostra come creare una distribuzione pay-as-you-go riutilizzando la configurazione di una distribuzione esistente tramite AWS CLI e gli script nella cartella scripts di questo articolo.

Quando la console offre solo opzioni Gratuite o Pro

Amazon ha introdotto piani di prezzo a tariffa fissa per CloudFront (Gratuito, Pro, Business, Premium) che includono il CDN con WAF, protezione DDoS, Route 53 e altri servizi a un prezzo fisso mensile senza sovrapprezzo. Nella console CloudFront, quando si crea una nuova distribuzione, si vedono ora solo opzioni Gratuite o Pro (e superiori). Il piano Pro inizia da 15 dollari al mese; non c’è un’opzione visibile “pay-as-you-go” lì.

Pay-as-you-go è comunque il predefinito quando si crea una distribuzione tramite CloudFront API o AWS CLI (create-distribution). Quindi, se hai già una distribuzione creata precedentemente (o tramite CLI) e vuoi un’altra con lo stesso comportamento—es. origine S3 sito web più Lambda@Edge per index.html—puoi esportare la configurazione di quella distribuzione, modificarla e creare una nuova distribuzione. La nuova sarà pay-as-you-go a meno che non la colleghi a un piano a tariffa fissa in seguito.

Cosa ti serve

  • Una distribuzione CloudFront esistente la cui configurazione puoi copiare (es. una utilizzata per un altro sito Hugo, o una creata prima del cambiamento della console).
  • AWS CLI installato e configurato con credenziali che possono eseguire cloudfront:GetDistributionConfig e cloudfront:CreateDistribution.
  • jq (o simile) per modificare la configurazione JSON.

Gli script utilizzati di seguito si trovano nella cartella scripts di questo post: current-distribution-config.json, new-distribution-config.json, updated-distribution-config.json, e final-distribution-config.json.

Passo 1: Ottenere la configurazione della distribuzione esistente

Ottieni la configurazione completa della distribuzione (incluso ETag) e salvala:

# Sostituisci ABCDEFG con l'ID della tua distribuzione esistente
aws cloudfront get-distribution-config --id ABCDEFG > current-distribution-config.json

get-distribution-config restituisce un oggetto wrapper con ETag e DistributionConfig. Per creare una nuova distribuzione, passi solo l’oggetto interno DistributionConfig, quindi lo estraiamo:

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

A questo punto new-distribution-config.json sembra il seguente (abbreviato). Includerebbe CallerReference, Aliases, Origins, DefaultRootObject e DefaultCacheBehavior con Lambda@Edge. Per il dominio del sito di esempio ho sostituito 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
        }
      ]
    }
  }
}

Passo 2: Impostare un CallerReference unico

Ogni distribuzione deve avere un unico CallerReference. Riutilizzare lo stesso valore di un’altra distribuzione fa sì che l’API rifiuti la richiesta. Usa una stringa nuova o 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

Passo 3: Modificare gli alias e le origini (opzionale)

Se il nuovo sito utilizza un dominio o un bucket S3 diverso, aggiorna Aliases e Origins in updated-distribution-config.json per adattarli (es. nuovo endpoint del sito web del bucket e lista di alias). Se desideri una distribuzione senza dominio personalizzato per il momento, cancella gli alias:

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

Se devi puntare a un diverso endpoint del sito web S3, modifica la sezione Origins nello stesso file (es. cambia Id e DomainName con l’host del nuovo nome del bucket e imposta DefaultCacheBehavior.TargetOriginId a quel medesimo Id).

Passo 4: Creare la nuova distribuzione

Crea la distribuzione dalla configurazione finale:

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

La risposta include l’Id, ARN, DomainName e Status della nuova distribuzione. La nuova distribuzione utilizza per default il pay-as-you-go. Poi puoi puntare il tuo DNS (o Route 53) al nuovo dominio CloudFront e, se lo utilizzi per Hugo, distribuisci con Hugo deploy o AWS CLI come di consueto.

Riferimento rapido: script completo

Inserito insieme (utilizzando un ID di distribuzione esistente e cancellando gli alias), il flusso è:

# 1) Esporta e estrai DistributionConfig
aws cloudfront get-distribution-config --id EABCDEFGZ > current-distribution-config.json
jq '.DistributionConfig' < current-distribution-config.json > new-distribution-config.json

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

# 3) Opzionale: nessun dominio personalizzato
jq '.Aliases = {"Quantity": 0, "Items": []}' updated-distribution-config.json > final-distribution-config.json

# 4) Crea (pay-as-you-go) distribuzione
aws cloudfront create-distribution --distribution-config file://final-distribution-config.json
  • Pay-as-you-go: Paga per il trasferimento dei dati e le richieste; il livello gratuito permanente di CloudFront include 1 TB di trasferimento dati e 10 milioni di richieste HTTP/HTTPS al mese. Nessuna tariffa mensile.
  • Piani a tariffa fissa: Documentati qui. Il piano gratuito ha limiti inferiori (es. 1 milione di richieste, 100 GB); il piano Pro inizia da 15 dollari al mese con maggiore capacità e servizi inclusi come WAF, Route 53, ecc. Nessun sovrapprezzo.

Se il tuo traffico si adatta al livello gratuito di pay-as-you-go e non hai bisogno delle funzionalità incluse dei piani a tariffa fissa, creare distribuzioni tramite CLI come sopra ti mantiene su pay-as-you-go mentre la console mostra solo opzioni Gratuite/Pro.