Гид по технологиям

Бессерверный хостинг на AWS: S3 + CloudFront

• 7 min read • DevOps • Обновлено 18 Nov 2025
Бессерверный хостинг на AWS: S3 + CloudFront
Бессерверный хостинг на AWS: S3 + CloudFront

Логотип AWS

Быстрые ссылки

  • Как работает бессерверный хостинг
  • На что обратить внимание по стоимости
  • Настройка статического сайта в S3
  • Подключение CDN CloudFront

Как работает бессерверный хостинг

Термин “бессерверный” здесь означает, что вы не управляете собственными виртуальными машинами для размещения сайта — вместо этого используете управляемые сервисы. Для статических сайтов это обычно комбинация S3 (Simple Storage Service) как origin для файлов и CloudFront — CDN от AWS — как слой доставки. S3 хранит файлы (HTML/CSS/JS/изображения), а CloudFront кэширует их на ближайших edge-узлах для ускорения и снижения стоимости.

Определение: статический сайт — сайт, который отдаёт готовые файлы без динамической генерации на сервере.

Преимущества:

  • Масштабируемость: S3 и CloudFront автоматически выдерживают пиковую нагрузку.
  • Простота: нет управления ОС, патчей или конфигурации веб-сервера.
  • Низкие затраты при небольшой нагрузке: оплата за использование и трафик.

Ограничения:

  • Нельзя выполнять серверный код в рамках S3; требуются отдельные бессерверные функции (Lambda) или API Gateway для динамики.
  • Публичный доступ к содержимому требует осторожности: нельзя хранить секреты в публичных бакетах.

Важно: “Статический” не значит простейший — современные SPA (React, Vue, Svelte) полностью работают как статические приложения, если фронтенд общается с API.

Схема сетевой архитектуры: CloudFront перед S3

В типичной архитектуре CloudFront принимает запросы пользователей и, при отсутствии кэша, запрашивает файл в S3. CloudFront хранит кэш на edge-узлах, снижая задержки и число обращений к S3.

Если нужен бекенд, то API можно реализовать отдельными сервисами: Lambda + API Gateway, ECS/Fargate или внешние API. Это разделяет масштабирование статики и API.

Пример клиентского SPA, хранящегося в S3 и обслуживаемого через CloudFront

Если хотите узнать про API Gateway + Lambda, посмотрите документацию AWS по связке этих сервисов.

На что обратить внимание по стоимости

Модель оплаты бессерверного хостинга привязана к использованию: трафик (GB), число запросов и хранение данных в S3. Это удобно для непостоянных нагрузок: вы не оплачиваете простаивающие виртуальные машины.

Ключевые моменты:

  • AWS имеет постоянно бесплатный слой для новых аккаунтов и некоторых ресурсов. Тем не менее условия меняются; проверяйте актуальную страницу AWS Free Tier.
  • CloudFront часто предлагает большие объёмы бесплатного трафика в рамках промо/условий; это зависит от региона и типа аккаунта. Не полагайтесь на вечную бесплатность для больших проектов.
  • Хранение больших объёмов данных в S3 и большое число запросов (GET/PUT) могут дать заметные счета.

Советы по сокращению затрат:

  • Максимально используйте кэширование CloudFront: корректные Cache-Control и правильные TTL для статических файлов.
  • Минимизируйте количество запросов к S3 (bundle/concatenate, tree-shaking, кеш-бастерные имена файлов).
  • Используйте сжатие (gzip/brotli) и минимизацию ресурсов.
  • Переносите тяжёлые активы (видео) в специализированные хранилища или платные CDN с подходящей ценой.

Настройка статического сайта в S3 — пошагово

Ниже — практическая последовательность действий, от создания бакета до публикации.

  1. Создать S3-бакет в нужном регионе.
  2. Отключить “Block Public Access” только если вы публикуете публичный статический сайт (AWS предупреждает о рисках).
  3. Настроить политику бакета для публичного чтения объектов.
  4. Загрузить файлы (через консоль или aws cli).
  5. Включить “Static Website Hosting” в свойствах бакета и указать index.html и страницу ошибки.
  6. Подключить CloudFront и опубликовать дистрибуцию; привязать сертификат ACM и DNS.

Пример политики бакета для публичного чтения (замените example-bucket на имя вашего бакета):

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PublicReadGetObject",
      "Effect": "Allow",
      "Principal": "*",
      "Action": [
        "s3:GetObject"
      ],
      "Resource": [
        "arn:aws:s3:::example-bucket/*"
      ]
    }
  ]
}

Загрузка содержимого с локальной машины через AWS CLI:

aws s3 sync . s3://bucket-name

После синхронизации в консоли S3 вы увидите index.html и остальные файлы.

В свойствах бакета включите Static Website Hosting и укажите Index document и Error document. После этого S3 выдаст endpoint-URL вашего сайта.

Включение статического хостинга в свойствах бакета

Загрузка файлов в бакет

Конфигурация статического веб-хостинга

Подключение CloudFront

CloudFront ускоряет доставку и добавляет гибкие механизмы управления кэшированием, HTTPS и кастомными доменами.

Основные шаги:

  1. Создайте новую CloudFront distribution и укажите S3 bucket как Origin (используйте Origin Domain Name — выбирается из списка).
  2. Настройте поведение кэша (Default Cache Behavior). Для большинства сайтов дефолтные параметры подходят.
  3. Запросите сертификат в AWS Certificate Manager (ACM) для вашего домена. Валидация часто проходит через DNS (если не используете Route 53, потребуется добавить CNAME записи в ваш DNS-провайдер).
  4. В CloudFront укажите ваш ACM-сертификат и альтернативные имена (CNAME) — ваш домен.
  5. В DNS добавьте CNAME/ALIAS запись, указывающую на CloudFront distribution domain.
  6. Подождите завершения развертывания (обычно несколько минут; иногда до 15–20 мин).

Создание распределения CloudFront

Запрос сертификата ACM

После успешного деплоя вы сможете открыть сайт по CloudFront endpoint или по своему домену.

Тестирование работы сайта, сервируемого из S3 через CloudFront

Лучшие практики кэширования и производительности

  • Устанавливайте Cache-Control и ETag для статических файлов. Для часто меняемых файлов используйте короткий TTL и стратегию cache-busting (именование по хешу).
  • Для неизменяемых активов используйте долгий TTL и имена файлов с хешем.
  • Включайте Brotli/gzip сжатие на этапе сборки и настройте правильные Content-Encoding заголовки.
  • Используйте минимизацию и объединение ресурсов, когда это уместно.
  • Настройте политики CORS, если фронтенд обращается к API на другом домене.

Безопасность и конфиденциальность

  • Никогда не храните секреты, ключи или личные данные в публичных бакетах.
  • Для приватных ресурсов используйте подписи (pre-signed URLs) или ограничение доступа через Origin Access Identity (OAI) в CloudFront.
  • Включите HTTPS через ACM и настраиваемые политики безопасности TLS в CloudFront.
  • Рассмотрите возможность использования WAF (Web Application Firewall) для защиты от DDoS и OWASP-угроз.
  • Для соответствия требованиям конфиденциальности (например, GDPR) документируйте, где и как хранятся пользовательские данные и какие регионы используются.

Проверка и отладка

Проверки перед релизом:

  • Открывается index.html по кастомному домену и по CloudFront endpoint.
  • Страницы возвращают корректные заголовки Cache-Control и Content-Type.
  • HTTPS сертификат корректен, нет mixed content.
  • CORS корректно настроен для внешних запросов.

Полезные команды и инструменты:

  • aws s3 ls / aws s3 sync — для управления файлами через CLI.
  • curl -I https://your-domain — проверить заголовки ответа.
  • браузерный DevTools — проверить загрузку ресурсов, статус кода и заголовки.

Критерии приёмки

  • Главная страница загружается по HTTPS без ошибок.
  • Статические ресурсы получают ожидаемые заголовки кэширования.
  • Контент обновляется после релиза (при использовании кеш-бастинга).
  • Отсутcтvuют конфиденциальные данные в публичном бакете.

Чек-листы по ролям

Разработчик:

  • Собрать оптимизированную сборку (минификация, tree-shaking).
  • Проверить работоспособность SPA на локальном сервере.
  • Прописать правильные относительные/абсолютные пути.

DevOps / Инженер выдачи:

  • Создать S3-бакет и настроить политику.
  • Настроить CloudFront distribution и ACM сертификат.
  • Настроить DNS (CNAME/ALIAS).
  • Настроить CI/CD (CodePipeline/Actions) для автоматического деплоя.

Специалист по безопасности:

  • Проверить отсутствие секретов в бакете.
  • Настроить OAI/Origin Access Control, если нужно ограничить прямой доступ к S3.
  • Включить WAF и контролировать правила.

Контент-менеджер:

  • Проверить формат и доступность загружаемых файлов.
  • Убедиться, что изображения и медиа оптимизированы по размеру.

Простая методология деплоя (минимальный SOP)

  1. Пройти CI билд и сгенерировать артефакты.
  2. Синхронизировать артефакты в S3: aws s3 sync –delete ./build s3://bucket-name
  3. Инвалидировать кэш CloudFront при необходимости (если не используете имена с хешем).
  4. Мониторить логи и метрики после деплоя.

Примеры команд для автоматизации

Синхронизация и инвалидация (пример):

aws s3 sync ./build s3://example-bucket --delete
aws cloudfront create-invalidation --distribution-id E123ABC45 --paths "/index.html" "/static/*"

Дерево решений для выбора подхода

flowchart TD
  A[Нужен ли динамический бэкенд?] -->|Да| B[Использовать Lambda/API Gateway или внешние сервисы]
  A -->|Нет| C[Чисто статический сайт — S3 + CloudFront]
  B --> D[Развернуть API отдельно и подключить к фронтенду]
  C --> E[Настроить S3, CloudFront, SSL и DNS]
  D --> E

Когда этот подход не подходит

  • Если у вас серверная логика с контентом, генерируемым на ходу (например, WordPress без headless-режима).
  • Если ваши активы требуют транзакционной обработки на сервере или постоянного взаимодействия с файловой системой.

Миграция и совместимость

  • Большинство статических сайтов легко мигрируются: просто синхронизируйте файлы в S3 и настройте CloudFront.
  • Для сервисов, завязанных на специфические веб-серверы (например, .htaccess для переадресаций), потребуется адаптация — использовать правила CloudFront или редиректы на уровне сборки.

Риски и способы их снижения

  • Неправильная политика доступа → проводить аудит объектов перед публикацией.
  • Утечка секретов → хранить секреты в Secrets Manager или Parameter Store.
  • Проблемы с кэшем после апдейта → внедрить кеш-бастинг и/или автоматические инвалидации CloudFront.

Шаблон проверки перед релизом

  • Сборка прошла успешно в CI
  • Файлы загружены в S3
  • Домен указывает на CloudFront
  • SSL валиден и HTTPS работает
  • Проверены заголовки Cache-Control
  • В логах нет ошибок 5xx

Краткое резюме

Этот подход даёт простой, масштабируемый и экономичный способ хостинга статических сайтов: S3 хранит контент, CloudFront отвечает за доставку и масштабирование. Для динамики используйте бессерверные функции или отдельные API. При соблюдении правил кэширования, безопасности и CI/CD вы получите надёжную систему для production-сайтов.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро