Политика Amazon S3 + Liip Imagine Cache Resolver

Я настроил определитель кэша Amazon S3 с помощью пакета Liip Imagine, и у меня возникли проблемы с получением правильных прав, установленных в корзине, чтобы предотвратить вывод содержимого каталога в браузере.

Мой сценарий:

На сайте S3 имеется довольно много графических ресурсов - некоторые загружаются вручную, а многие также загружаются через CMS с помощью пакета Vich Upload. Я использую пакет Imagine для разрешения кэшированных изображений на основе фильтров, определенных в файле config.yml (для таких вещей, как миниатюры и превью), которые затем сохраняются в отдельных каталогах в моей корзине S3, названной в честь фильтра. Короче говоря, выгрузите оригинал на S3 -> автоматически разрешенные кэшированные файлы, хранящиеся на S3. Работает отлично.

Эта проблема

Единственный способ разрешить кэшированные файлы при первом запросе - это иметь широко открытые публичные разрешения в корзине. Это нехорошо, потому что когда вы делаете это, S3 предоставляет "багетный проводник" в виде XML-файла, в котором перечисляется все содержимое баков (или, по крайней мере, первые 1000 записей). Мне нужно, чтобы все файлы были общедоступными, но я не могу иметь их список в любой момент времени, потому что у нас были проблемы с людьми, прослушивающими этот клиентский сайт до запуска нового продукта. Я по крайней мере не хочу список имен файлов там.

Что я пробовал

Я пробовал несколько комбинаций параметров в списке ACL в сочетании со следующей политикой корзины:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AddPerm",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::[MY_BUCKET]/*"
        }
    ]
}

И я обнаружил, что кэшированные файлы не будут обрабатываться, если группе "Все" в открытом доступе не будут предоставлены разрешения "Список объектов". Как только я отключаю это разрешение (которое отключает просмотр XML-файла в браузере), не загруженные файлы больше не могут быть разрешены при загрузке.

Что еще я пробовал

Я также попытался настроить ведро в качестве веб-сайта и загрузил по умолчанию index.html файл в корне, по какому-то предложению я нашел здесь. Это ничего не сделало. Может быть, я что-то упустил.

Я также попытался убедиться, что папки разрешения кэша были общедоступными в S3 с отключенным разрешением списка объектов в корзине. Это тоже не сработало.

Ошибка

Когда разрешение на список объектов удалено, при попытке разрешения возникает следующая ошибка

Error executing "CreateBucket" on "https://[MY_BUCKET].s3.amazonaws.com/"; 
AWS HTTP error: Client error: `PUT https://[MY_BUCKET].s3.amazonaws.com/` 
resulted in a `403 Forbidden` response:

<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code>
<Message>Access Denied</Message><RequestId>94D939 (truncated...)
AccessDenied (client): Access Denied - <?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message>
<RequestId>[HIDDEN]</RequestId>
<HostId>[HIDDEN]</HostId>
</Error>

Структура ковша такая

[MY_BUCKET]
  -thumbnails // <-- where thumbnails are resolved
  -previews // <-- where previews are resolved
  -uploads  // <-- primary uploads parent dir
  --products // <-- where products are uploaded
  --other // <-- where other files are uploaded
  --images // <-- where images are manually uploaded

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

При необходимости я могу предоставить информацию о конфигурации от Symfony, но у меня нет проблем с этим, поэтому я не думал, что это будет необходимо.

В конечном счете, мне просто нужно позволить распознавателю делать свое дело и предотвращать доступ браузера к содержимому корзины.

1 ответ

Решение

Я понял это. Это потребовало корректировки политики на уровне IAM, изменив узел ресурса с:

...
"Resource":[
    "arn:aws:s3:::[MY_BUCKET]/*"
]

чтобы:

....
"Resource":[
    "arn:aws:s3:::*"
]
Другие вопросы по тегам