Доступы 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.
Проверьте себя
1. Каков доступ к новому бакету S3 по умолчанию?
AПубличный на чтение и запись
BПриватный — доступ только у владельца
CПубличный только на чтение
DДоступен всем в регионе
2. Какое действие нужно разрешить публике для статического сайта на S3?
As3:DeleteObject
Bs3:GetObject
Cs3:PutObject
Ds3:CreateBucket