Creare un AWS CloudFront su base Pay-as-You-Go (non il piano gratuito)
Creare CloudFront pay-as-you-go tramite AWS CLI.
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.

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:GetDistributionConfigecloudfront: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 vs. tariffa fissa (riepilogo)
- 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.
Link utili
- Distribuisci un sito generato da Hugo su AWS S3
- Distribuisci un sito Hugo su AWS S3 con AWS CLI
- Prezzo pay-as-you-go di Amazon CloudFront
- Piani di prezzo a tariffa fissa di CloudFront (Guida per sviluppatori)
- Introduzione ai piani di prezzo a tariffa fissa senza sovrapprezzo (Blog AWS)
- create-distribution (AWS CLI)
- get-distribution-config (AWS CLI)