Ответ
Самый экономичный и эффективный способ разместить статический сайт на AWS — использовать комбинацию Amazon S3 для хранения и Amazon CloudFront в качестве CDN. Вот пошаговый процесс, который я применял:
1. Подготовка файлов:
Убедитесь, что у вас есть все статические файлы (HTML, CSS, JS, изображения) и index.html — это документ по умолчанию.
2. Создание и настройка S3 bucket:
# Создание bucket с именем, соответствующим домену (например, www.example.com)
aws s3 mb s3://www.example.com
# Включение хостинга статических сайтов
aws s3 website s3://www.example.com --index-document index.html --error-document error.html
# Политика доступа для публичного чтения (Bucket Policy)
# Примените через консоль AWS или сохраните в файл policy.json:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::www.example.com/*"
}
]
}
aws s3api put-bucket-policy --bucket www.example.com --policy file://policy.json
3. Загрузка файлов в S3:
aws s3 sync ./src s3://www.example.com/ --acl public-read
# Или с использованием более новой команды (без явного --acl)
aws s3 sync ./src s3://www.example.com/
4. Настройка CloudFront (рекомендуется для продакшена): CloudFront обеспечит HTTPS, глобальную доставку, кеширование и позволит привязать собственный домен с SSL-сертификатом из AWS Certificate Manager (ACM).
- В консоли CloudFront создайте новое распределение (Distribution).
- Origin Domain: Выберите созданный S3 bucket (автоматически подставится endpoint для статического хостинга, например,
www.example.com.s3-website-us-east-1.amazonaws.com). - Viewer Protocol Policy: Redirect HTTP to HTTPS.
- Default Root Object:
index.html. - В разделе "Alternate Domain Names (CNAMEs)" укажите ваш домен (например,
www.example.com). - Привяжите SSL-сертификат из ACM для этого домена.
5. Настройка DNS в Route 53: Создайте запись типа A (Alias), которая указывает на ваш дистрибутив CloudFront.
Альтернатива для очень простых случаев: Можно использовать только S3, и сайт будет доступен по endpoint вида http://www.example.com.s3-website-region.amazonaws.com. Однако отсутствие HTTPS и кастомного домена делает этот вариант неподходящим для реальных проектов.
Инфраструктура как код (IaC): В реальных проектах я автоматизирую это развертывание с помощью Terraform, создавая модуль, который разворачивает S3, CloudFront, ACM и настраивает Route 53 за один прогон.