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.

Page content

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.

Dokumentacja nie odpowiada rzeczywistym dostawom z źródła

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:GetDistributionConfig i cloudfront: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