Utwórz AWS CloudFront na modelu Pay-as-You-Go (nie plan bezpłatny)
Utwórz CloudFront na zasadzie płatność za użycie za pomocą AWS CLI.
Plan AWS Free nie działa dla mnie i Pay-as-you-go jest ukryty dla nowych dystrybucji CloudFront na konsoli AWS .
Kiedy hostujesz strony oparte na Hugo na AWS, zwykle umieszczasz zbiornik za CloudFront i dołączasz funkcję Lambda@Edge, aby żądania do ścieżek katalogów (np. /blog/) były przekształcane na /blog/index.html dla źródeł typu S3 website. Możesz wtedy użyć hugo deploy lub wdróżć za pomocą AWS CLI w celu zsynchronizowania zbudowanej strony. Problem: potrzebujesz dystrybucji CloudFront, która używa tej Lambdy, a jeśli chcesz uniknąć zobowiązań do planów płatnych, pay-as-you-go. Konsola nie pozwala już wybrać tylko opcji Free lub Pro.

Ten wpis pokazuje, jak utworzyć dystrybucję pay-as-you-go ponownie wykorzystując konfigurację istniejącej dystrybucji za pomocą AWS CLI i skryptów w folderze scripts tego artykułu.
Kiedy konsola oferuje tylko opcje Free lub Pro
Amazon wprowadził płatne plany CloudFront z tarifą stałą (Free, Pro, Business, Premium), które łączą CDN z WAF, ochroną przed DDoS, Route 53 i innymi usługami za stałą miesięczną opłatę bez nadpłat. W konsoli CloudFront, kiedy tworzysz nową dystrybucję, teraz widzisz tylko opcje Free lub Pro (i wyższe). Plan Pro zaczyna się od 15 dolarów miesięcznie; nie ma widocznej opcji „pay-as-you-go” tam.
Pay-as-you-go nadal jest domyślnie używany, kiedy tworzysz dystrybucję przez CloudFront API lub AWS CLI (create-distribution). Więc jeśli masz już utworzoną dystrybucję wcześniej (lub przez CLI) i chcesz inną z tą samą funkcją — np. źródło S3 website plus Lambda@Edge dla index.html — możesz eksportować konfigurację tej dystrybucji, dostosować ją i utworzyć nową dystrybucję. Nowa będzie płatna po użyciu, chyba że później dołączysz ją do planu płatnego.
Co potrzebujesz
- Istniejąca dystrybucja CloudFront, której konfigurację możesz skopiować (np. używana dla innej strony Hugo, lub utworzona przed zmianą w konsoli).
- AWS CLI zainstalowany i skonfigurowany z poświadczeniami, które mogą uruchomić
cloudfront:GetDistributionConfigicloudfront:CreateDistribution. - jq (lub podobny) do edycji konfiguracji JSON.
Przykładowe skrypty używane poniżej znajdują się w folderze scripts tego posta: current-distribution-config.json, new-distribution-config.json, updated-distribution-config.json, i final-distribution-config.json.
Krok 1: Pobierz istniejącą konfigurację dystrybucji
Pobierz pełną konfigurację dystrybucji (w tym ETag) i zapisz ją:
# Zastąp ABCDEFG swoim istniejącym identyfikatorem dystrybucji
aws cloudfront get-distribution-config --id ABCDEFG > current-distribution-config.json
get-distribution-config zwraca obiekt wrapper z ETag i DistributionConfig. Dla tworzenia nowej dystrybucji przekazujesz tylko wewnętrzny DistributionConfig, więc go wyciągamy:
jq '.DistributionConfig' < current-distribution-config.json > new-distribution-config.json
W tym momencie new-distribution-config.json wygląda mniej więcej tak (skróconie).
Zawiera CallerReference, Aliases, Origins, DefaultRootObject i DefaultCacheBehavior z Lambda@Edge.
Dla przykładowego domeny strony wstawiam 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
}
]
}
}
}
Krok 2: Ustaw unikalny CallerReference
Każda dystrybucja musi mieć unikalny CallerReference. Używanie tej samej wartości jak inna dystrybucja powoduje, że API odrzuca żądanie. Użyj nowego ciągu lub znacznika czasu:
NEW_CALLER_REF="new-distr-$(date +%s)"
jq --arg ref "$NEW_CALLER_REF" '.CallerReference = $ref' new-distribution-config.json > updated-distribution-config.json
Krok 3: Dostosuj aliasy i źródła (opcjonalnie)
Jeśli nowa strona używa innego domeny lub S3 bucket, zaktualizuj Aliases i Origins w updated-distribution-config.json, aby pasowały (np. nowy punkt końcowy website bucket i lista aliasów). Jeśli chcesz dystrybucję bez domeny niestandardowej, wyczyść aliasy:
jq '.Aliases = {"Quantity": 0, "Items": []}' updated-distribution-config.json > final-distribution-config.json
Jeśli musisz wskazać inny punkt końcowy S3 website, edytuj sekcję Origins w tym samym pliku (np. zmień Id i DomainName na nową nazwę hosta bucketu, i ustaw DefaultCacheBehavior.TargetOriginId na ten sam Id).
Krok 4: Utwórz nową dystrybucję
Utwórz dystrybucję z końcowej konfiguracji:
aws cloudfront create-distribution --distribution-config file://final-distribution-config.json
Odpowiedź zawiera nowy Id, ARN, DomainName i Status dystrybucji. Nowa dystrybucja domyślnie używa pay-as-you-go. Możesz wtedy wskazać swoje DNS (lub Route 53) na nową domenę CloudFront i, jeśli używasz jej dla Hugo, wdrażaj z Hugo deploy lub AWS CLI jak zwykle.
Szybki przewodnik: pełny skrypt
Sklejony (używając istniejącego identyfikatora dystrybucji i usuwając aliasy), przepływ jest taki:
# 1) Eksportuj i wyodrębnij DistributionConfig
aws cloudfront get-distribution-config --id EABCDEFGZ > current-distribution-config.json
jq '.DistributionConfig' < current-distribution-config.json > new-distribution-config.json
# 2) Unikalny CallerReference
NEW_CALLER_REF="new-distr-$(date +%s)"
jq --arg ref "$NEW_CALLER_REF" '.CallerReference = $ref' new-distribution-config.json > updated-distribution-config.json
# 3) Opcjonalnie: bez domeny niestandardowej
jq '.Aliases = {"Quantity": 0, "Items": []}' updated-distribution-config.json > final-distribution-config.json
# 4) Utwórz (pay-as-you-go) dystrybucję
aws cloudfront create-distribution --distribution-config file://final-distribution-config.json
Pay-as-you-go vs flat-rate (podsumowanie)
- Pay-as-you-go: Płacisz za transfer danych i żądania; stały darmowy limit CloudFront obejmuje 1 TB transferu danych i 10M żądań HTTP/HTTPS miesięcznie. Brak miesięcznej opłaty za plan.
- Plan płatny: Opisany tutaj. Darmowy plan ma mniejsze limity (np. 1M żądań, 100 GB); Pro zaczyna się od 15 dolarów miesięcznie z większą pojemnością i zintegrowanym WAF, Route 53 itp. Brak nadpłat.
Jeśli Twoja ruchliwość mieści się w darmowym limicie pay-as-you-go i nie potrzebujesz funkcji płatnych w ramach planu, tworzenie dystrybucji przez CLI jak powyżej zachowuje Cię w trybie pay-as-you-go, podczas gdy konsola pokazuje tylko opcje Free/Pro.
Przydatne linki
- Wdrażanie strony generowanej przez Hugo na AWS S3
- Wdrażanie strony Hugo na AWS S3 za pomocą AWS CLI
- Płatne cenniki CloudFront pay-as-you-go
- Plan płatne cenniki CloudFront (Przewodnik Dewelopera)
- Wprowadzenie planów płatnych z cennikami bez nadpłat (Blog AWS)
- create-distribution (AWS CLI)
- get-distribution-config (AWS CLI)