Как получить доступ к файлам из одного сегмента S3 в другое, не делая их общедоступными? - PullRequest
0 голосов
/ 09 января 2019

Чтобы сделать файлы доступными для других корзин S3, нам нужно либо сделать корзину общедоступной, либо включить настройку cors.

У меня есть HTML-страница в одном общедоступном сегменте, которая размещается как статический веб-сайт. В другом ведре у меня есть mp3-файлы. Это ведро не является публичным. Из первого блока HTML-файл вызывает файл script.js, который пытается получить доступ к файлам MP3 во втором сегменте, используя URL-адрес ресурса. Это невозможно напрямую и выдает ошибку 403. Поэтому я написал конфигурацию CORS для сегмента 2 с ARN первого блока. Тем не менее, сценарий не смог получить доступ к файлам MP3. Я также попытался использовать статический URL веб-сайта вместо ARN. Снова получил ошибку 403. Можно ли включить скрипт.js для доступа к mp3-файлам в bucket-2, не делая bucket-2 общедоступным?

1 Ответ

0 голосов
/ 09 января 2019

Вы должны понимать, что ваш javascript запускается в окне браузера клиента, следовательно, это браузер, пытающийся получить доступ к mp3-файлу во втором, а не в первом.

Зная, что не существует простого решения вашей проблемы, кроме открытия доступа ко второму сегменту и использования CORS, как вы пытались (но только один CORS не даст доступа к частному сегменту)

Предложение 1: подписи, созданные вручную

Если вы просто хотите предоставить доступ к нескольким файлам во втором сегменте (и не ко всем файлам), я бы порекомендовал включить в ваш javascript полностью подписанный URL-адрес объекта во втором блоке. Подписанные URL-адреса позволяют получить доступ к отдельным объектам в непубличном сегменте в соответствии с документацией S3 . Однако генерирование подписей не является тривиальным и требует немного кода.

Я написал эту утилиту командной строки, чтобы помочь вам сгенерировать подпись для данного объекта в приватной корзине. https://github.com/sebsto/s3sign

В настоящее время в командной строке AWS также есть опция presign https://docs.aws.amazon.com/cli/latest/reference/s3/presign.html

Кроме того, подпись ограничена по времени, и максимальный возраст составляет 7 дней Так что, если вы выберете этот подход, вам потребуется пересоздавать ссылки каждую неделю. Это не очень масштабируемо, но может быть легко автоматизировано.

Предложение 2: динамическое создание подписи на веб-сервере

Если вы решили отойти от Javascript на стороне клиента и использовать вместо этого сгенерированные на стороне сервера страницы (используя Python, Ruby, PhP и т. Д. И сервер), вы можете динамически генерировать подписи с вашего сервера. Недостатком этого подхода является то, что вам потребуется сервер.

Предложение 3: динамическая генерация подписи, без сервера

Если вы знакомы с AWS Lambda и API Gateway, вы можете создать безсерверный сервис, который будет динамически возвращать подписанный URL-адрес в ваш файл MP3. Ваша статическая HTML-страница (или Javascript на стороне клиента) будет вызывать URL-адрес API-шлюза, а API-шлюз будет вызывать Lambda, а Lambda на основе пути или строки запроса вернет соответствующий подписанный URL-адрес для вашего MP3.

С предложениями 2 и 3 связаны затраты AWS (либо для запуска сервера EC2, либо для времени выполнения шлюза API и лямбды), поэтому обязательно проверяйте Цены AWS перед выбором варианта. (подсказка: предложение 3 будет более рентабельным)

Настоящий вопрос в том, ПОЧЕМУ ты хочешь создать это? Почему вы не можете хранить весь свой публичный контент в одной корзине, используя тонкодисперсные политики доступа S3, когда это необходимо.

...