Доступы S3 и статический сайт
Делаем бакет приватным или публичным и публикуем из него статический сайт.
Bucket policy — JSON-политика на уровне бакета, определяющая, кому и какие операции разрешены с его объектами.
По умолчанию всё закрыто
Новый бакет приватен: доступ есть только у владельца. Это правильно — большинство данных не должны быть публичными. Чтобы что-то открыть наружу, нужно осознанно ослабить настройки. AWS даже добавил «Block Public Access» — рубильник, который по умолчанию блокирует любой публичный доступ, чтобы вы не открыли бакет случайно.
Когда нужен публичный доступ
Классический случай — статический сайт: HTML, CSS, картинки, которые должен видеть весь интернет. S3 умеет раздавать такие файлы как веб-сайт. Для этого нужно: включить режим Static website hosting, снять Block Public Access и повесить bucket policy на чтение.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadForWebsite",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-site-bucket/*"
}
]
}Здесь Principal: "*" означает «кто угодно», а s3:GetObject — только чтение. Запись остаётся закрытой.
Загрузка сайта и проверка
# загрузить файлы сайта в бакет
aws s3 cp index.html s3://my-site-bucket/
aws s3 cp style.css s3://my-site-bucket/
# включить режим веб-сайта
aws s3 website s3://my-site-bucket/ --index-document index.htmlВывод:
upload: ./index.html to s3://my-site-bucket/index.html upload: ./style.css to s3://my-site-bucket/style.css Site endpoint: http://my-site-bucket.s3-website.eu-central-1.amazonaws.com
Как работает под капотом
Каждый запрос к объекту S3 проходит проверку: складываются настройки Block Public Access, bucket policy и права IAM запрашивающего. Если хоть один уровень запрещает — доступа нет (запрет сильнее разрешения, как и везде в AWS). Когда вы включаете static website hosting, S3 начинает отвечать на простые HTTP-запросы, отдавая index.html для корня и заданную страницу для ошибок. Для настоящего сайта поверх этого обычно ставят CloudFront — он добавляет HTTPS, кеширование на edge и собственный домен.
Частые ошибки
- Случайно открыть бакет с приватными данными. Это самая частая утечка в облаках; не снимайте Block Public Access без необходимости.
- Открыть лишние действия. Для сайта нужен только
s3:GetObject; не давайте публике запись. - Раздавать сайт прямо с S3 без CloudFront. Тогда не будет HTTPS и кеширования — для продакшена ставьте CloudFront впереди.
Итог
- Новый бакет приватен; публичный доступ открывают осознанно через bucket policy.
- Для статического сайта: включить website hosting, снять Block Public Access, дать публике только GetObject.
- Для HTTPS и кеширования перед бакетом ставят CloudFront.