Публичная раздача файлов
Файлы из бакета можно отдавать напрямую по HTTPS — без ключей доступа и предподписанных ссылок. Это подходит для изображений, видео, дистрибутивов, ассетов веб-приложений и отдельных статических страниц.
Нативный хостинг статического сайта не поддерживается. Операции
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. Подробнее об этом —
адресация бакетов.
Политика открывает объекты всему интернету, без авторизации и без учёта того, кто по ссылке пришёл. Применяйте её к отдельному бакету, заведённому под публичный контент, и не смешивайте в нём публичные и приватные данные.
Доступ из веб-приложения: 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 и ошибки, терминирует ваш домен с сертификатом, а сами файлы забирает из бакета.
Такая схема заодно снимает нагрузку с хранилища и позволяет кэшировать статику ближе к пользователю.
Приватная раздача
Если файл не должен быть доступен всем, публичная политика не нужна: используйте предподписанную ссылку с ограниченным сроком действия — см. шифрование и доступ.