Создайте AWS CloudFront по модели оплаты по фактическому использованию (не бесплатный тариф)
Создайте CloudFront с оплатой по фактическому использованию через AWS CLI.
План AWS Free не работает для меня, и Pay-as-you-go скрыт для новых распределений CloudFront в консоли AWS.
Когда вы хостите сайты на основе Hugo на AWS, вы обычно помещаете корзину за CloudFront и прикрепляете функцию Lambda@Edge, чтобы запросы к каталогам (например, /blog/) перенаправлялись на /blog/index.html для источников стиля сайта S3. Затем вы можете использовать hugo deploy или развертывание с помощью AWS CLI для синхронизации построенного сайта. Однако есть один нюанс: вам нужна распределение CloudFront, которое использует эту Lambda, и, если вы хотите избежать фиксированных планов с абонентской платой, платное использование по факту. В консоли больше нет возможности выбрать этот вариант — только бесплатные или профессиональные планы.

Эта статья показывает, как создать распределение платное использование путем повторного использования конфигурации существующего распределения с помощью AWS CLI и скриптов в папке scripts этой статьи.
Когда консоль предлагает только Бесплатный или Про
Amazon ввел фиксированные тарифные планы CloudFront (Бесплатный, Про, Бизнес, Премиум), которые объединяют CDN с WAF, защитой от DDoS, Route 53 и другими услугами за фиксированную ежемесячную плату без превышений. В консоли CloudFront, при создании нового распределения, вы теперь видите только варианты Бесплатный или Про (и выше). План Про начинается с $15/месяц; нет видимого варианта платное использование.
Платное использование по-прежнему является стандартным, когда вы создаете распределение через API CloudFront или AWS CLI (create-distribution). Поэтому, если у вас уже есть распределение, созданное ранее (или через CLI), и вы хотите еще одно с таким же поведением — например, источник сайта S3 плюс Lambda@Edge для index.html — вы можете экспортировать конфигурацию этого распределения, изменить ее и создать новое распределение. Новое будет платным использованием, если вы не прикрепите его к фиксированному плану позже.
Что вам нужно
- Существующее распределение CloudFront, чью конфигурацию вы можете скопировать (например, одно, используемое для другого сайта Hugo, или одно, созданное до изменения консоли).
- AWS CLI, установленный и настроенный с учетными данными, которые могут запускать
cloudfront:GetDistributionConfigиcloudfront:CreateDistribution. - jq (или аналогичный инструмент) для редактирования JSON-конфигурации.
Примерные скрипты, используемые ниже, находятся в папке scripts этой статьи: current-distribution-config.json, new-distribution-config.json, updated-distribution-config.json и final-distribution-config.json.
Шаг 1: Получите конфигурацию существующего распределения
Получите полную конфигурацию распределения (включая ETag) и сохраните ее:
# Замените ABCDEFG на ID вашего существующего распределения
aws cloudfront get-distribution-config --id ABCDEFG > current-distribution-config.json
get-distribution-config возвращает обертку объекта с ETag и DistributionConfig. Для создания нового распределения вы передаете только внутренний DistributionConfig, поэтому мы извлекаем его:
jq '.DistributionConfig' < current-distribution-config.json > new-distribution-config.json
На этом этапе new-distribution-config.json выглядит следующим образом (сокращенно). Он включает CallerReference, Aliases, Origins, DefaultRootObject и DefaultCacheBehavior с Lambda@Edge. Для примера домена сайта я указал 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
}
]
}
}
}
Шаг 2: Установите уникальный CallerReference
Каждое распределение должно иметь уникальный CallerReference. Использование того же значения, что и у другого распределения, заставит API отклонить запрос. Используйте новую строку или временную метку:
NEW_CALLER_REF="new-distr-$(date +%s)"
jq --arg ref "$NEW_CALLER_REF" '.CallerReference = $ref' new-distribution-config.json > updated-distribution-config.json
Шаг 3: Настройте псевдонимы и источники (опционально)
Если новый сайт использует другой домен или корзину S3, обновите Aliases и Origins в updated-distribution-config.json в соответствии (например, новый конечная точка сайта корзины и список псевдонимов). Если вы хотите распределение без пользовательского домена на данный момент, очистите псевдонимы:
jq '.Aliases = {"Quantity": 0, "Items": []}' updated-distribution-config.json > final-distribution-config.json
Если вам нужно указать на другую конечную точку сайта S3, отредактируйте раздел Origins в том же файле (например, измените Id и DomainName на имя хоста сайта новой корзины, и установите DefaultCacheBehavior.TargetOriginId на тот же Id).
Шаг 4: Создайте новое распределение
Создайте распределение из окончательной конфигурации:
aws cloudfront create-distribution --distribution-config file://final-distribution-config.json
Ответ включает Id, ARN, DomainName и Status нового распределения. Новое распределение использует платное использование по умолчанию. Затем вы можете указать свой DNS (или Route 53) на новый домен CloudFront, и если вы используете его для Hugo, развернуть с помощью Hugo deploy или AWS CLI как обычно.
Быстрая справка: полный скрипт
Склеенные вместе (используя существующий ID распределения и очищая псевдонимы), процесс выглядит следующим образом:
# 1) Экспорт и извлечение DistributionConfig
aws cloudfront get-distribution-config --id EABCDEFGZ > current-distribution-config.json
jq '.DistributionConfig' < current-distribution-config.json > new-distribution-config.json
# 2) Уникальный 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) Опционально: нет пользовательского домена
jq '.Aliases = {"Quantity": 0, "Items": []}' updated-distribution-config.json > final-distribution-config.json
# 4) Создание (платное использование) распределения
aws cloudfront create-distribution --distribution-config file://final-distribution-config.json
Платное использование vs фиксированные тарифы (кратко)
- Платное использование: Вы платите за передачу данных и запросы; бесплатный уровень CloudFront включает 1 ТБ передачи данных и 10 млн HTTP/HTTPS запросов в месяц. Нет ежемесячной платы за план.
- Фиксированные тарифные планы: Документированы здесь. Бесплатный план имеет более низкие лимиты (например, 1 млн запросов, 100 ГБ); Про начинается с $15/месяц с большей емкостью и встроенными WAF, Route 53 и т.д. Нет превышений.
Если ваш трафик вписывается в бесплатный уровень платного использования и вам не нужны встроенные функции фиксированного плана, создание распределений через CLI, как описано выше, сохраняет вас на платном использовании, в то время как консоль показывает только Бесплатный/Про.
Полезные ссылки
- Развертывание сайта, сгенерированного Hugo, в AWS S3
- Развертывание сайта Hugo в AWS S3 с помощью AWS CLI
- Цены CloudFront по платному использованию
- Фиксированные тарифные планы CloudFront (Руководство разработчика)
- Введение фиксированных тарифных планов без превышений (Блог AWS)
- create-distribution (AWS CLI)
- get-distribution-config (AWS CLI)