Как прокси файлы из S3 через приложение рельсы, чтобы избежать пиявок? - PullRequest
5 голосов
/ 28 октября 2010

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

Я использую скрепку для общего управления активами. Есть ли какой-нибудь встроенный способ для достижения этого типа прокси?

В общем, я могу легко разобрать URL-адреса из скрепки и указать их обратно на мой собственный контроллер. Что должно произойти с этого момента? Должен ли я просто использовать Net :: HTTP для загрузки изображения, а затем отправить его с send_data? Между ними я хочу войти в реферер и установить правильные заголовки Control-Cache, поскольку у меня есть обратный прокси-сервер перед приложением. Является ли Net :: HTTP + send_data резонным способом в этом случае?

Может быть, целые идеи действительно плохи по некоторым причинам, которых я не знаю в данный момент? В целом, я считаю, что использование прямых ссылок S3 на общедоступное ведро опасно и приводит к некоторым серьезным проблемам в случае пиявки / горячих ссылок ...

Обновление:

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

Ответы [ 4 ]

5 голосов
/ 23 июля 2011

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

render :text => proc { |response, output|
   AWS::S3::S3Object.stream(path, bucket) do |segment|
     output.write segment
     output.flush # not sure if this is needed
   end
 }

В зависимости от вашего веб-сервера это может (монгрел) или не может (вебрик) работать, так что не расстраивайтесь, если он не работает в процессе разработки.

4 голосов
/ 06 декабря 2010

Используйте (личное хранилище | личные файлы) и используйте подписанные URL-адреса для файлов, хранящихся на S3.

Подпись включает время истечения срока действия (например, 10 минут, независимо от того, что вы хотите установить),а также криптографический хеш.S3 откажется обслуживать файлы, если подпись недействительна или истек срок ее действия.

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

2 голосов
/ 21 апреля 2016

Введите временные предварительно подписанные URL:

   def show
      redirect_to Aws::S3::Presigner.new.presigned_url(
         :get_object, 
         bucket: 'mybucket', 
         key: '/folder/file.pdf'
         expires_in: 60)
    end

S3 по-прежнему распределяет контент, поэтому вы выгружаете работу из Rails (что очень медленно), обрабатывает HTTP-кэширование, операции HEAD и использует Amazon CDN.

1 голос
/ 02 ноября 2010

Я бы, вероятно, избегал этого - по крайней мере, до тех пор, пока у меня не будет другого выбора.

Вам необходимо принять во внимание, что вы, вероятно, также добавите к счету за пропускную способность, если загрузитеизображение каждый раз.Кроме того, при обработке каждого изображения с помощью сценария вам также потребуется больше ресурсов процессора и оперативной памяти, необходимых для этого.Не самая лучшая перспектива - ИМХО .

Я бы, вероятно, включил бы журналы доступа для Amazon S3 и написал бы небольшой инструмент для анализа использования и изменения разрешений дляведро / объект в случае использования идет крыша.Запускайте это как cronjob каждые 10 минут или около того, и вы должны сохранить?

Вы также можете использовать s3stat .Они также предлагают бесплатный план.

Редактировать: В соответствии с моей рекомендацией для Varnish я добавляю ссылку на запись в блоге о запрете хотлинкинга с помощью Varnish .

...