Перейти к основному содержимому

Публичная раздача файлов

Файлы из бакета можно отдавать напрямую по HTTPS — без ключей доступа и предподписанных ссылок. Это подходит для изображений, видео, дистрибутивов, ассетов веб-приложений и отдельных статических страниц.

warning

Нативный хостинг статического сайта не поддерживается. Операции PutBucketWebsite и GetBucketWebsite возвращают 501 XNotImplemented, website-эндпоинта нет, автоматическая отдача index- и error-документов и правила перенаправления недоступны. Полноценный «S3 static website» в том виде, как он работает в AWS, на этой платформе собрать нельзя.

Публичное чтение бакета

Доступ открывается политикой бакета. Пример — чтение всех объектов бакета любым клиентом:

cat > policy.json <<'JSON'
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicRead",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-site/*"
}
]
}
JSON

aws s3api put-bucket-policy \
--bucket my-site \
--policy file://policy.json \
--endpoint-url https://s3-msk.itgstore.io \
--profile itg-s3

После применения объект доступен по прямой ссылке:

https://s3-msk.itgstore.io/my-site/index.html

Если на площадке включён virtual-hosted-style, работает и короткий вид — https://my-site.s3-msk.itgstore.io/index.html. Подробнее об этом — адресация бакетов.

warning

Политика открывает объекты всему интернету, без авторизации и без учёта того, кто по ссылке пришёл. Применяйте её к отдельному бакету, заведённому под публичный контент, и не смешивайте в нём публичные и приватные данные.

Доступ из веб-приложения: CORS

Если файлы запрашиваются скриптом со страницы на другом домене, браузер потребует заголовков CORS:

aws s3api put-bucket-cors \
--bucket my-site \
--cors-configuration '{"CORSRules":[{"AllowedOrigins":["*"],"AllowedMethods":["GET","HEAD"],"AllowedHeaders":["*"]}]}' \
--endpoint-url https://s3-msk.itgstore.io \
--profile itg-s3

В рабочей конфигурации вместо * перечислите конкретные домены, которым разрешено обращаться к содержимому.

Что не работает

  • нет отдачи index.html при обращении к корню или «папке» — доступ всегда по полному ключу объекта;
  • нет error-документов — на отсутствующий объект вернётся стандартная ошибка хранилища, а не ваша страница;
  • нет правил перенаправления;
  • нет собственного домена на стороне хранилища.

Как сделать полноценный сайт

Поставьте перед хранилищем CDN или веб-сервер — например nginx. Он отдаёт индексные страницы, обрабатывает «красивые» URL и ошибки, терминирует ваш домен с сертификатом, а сами файлы забирает из бакета.

Такая схема заодно снимает нагрузку с хранилища и позволяет кэшировать статику ближе к пользователю.

Приватная раздача

Если файл не должен быть доступен всем, публичная политика не нужна: используйте предподписанную ссылку с ограниченным сроком действия — см. шифрование и доступ.