2010-10-27 52 views
5

爲了避免熱鏈接,S3帶寬榨取等我想使我的桶保密,並通過Rails應用程序提供文件。一般來說,概念聽起來很容易,但我不完全確定哪種方法最適合這種情況。如何通過rails應用程序從S3代理文件以避免受到侵害?

我使用回形針進行一般資產管理。是否有任何內置的方式來實現這種類型的代理?

一般而言,我可以輕鬆地從回形針解析網址,並將它們指回我自己的控制器。這一點應該發生什麼?我應該簡單地使用Net :: HTTP下載圖像,然後用send_data提供它嗎?在我之間我想記錄referer並設置適當的控制緩存頭,因爲我有一個在應用程序前面的反向代理。在這種情況下,Net :: HTTP + send_data是否合理?

也許整個想法真的很糟糕,因爲某些原因我現在還沒有意識到?我一般相信陶醉直接S3便捷的公共桶危險和產量的一些嚴重的問題在榨取/熱鏈接...

更新情況:

如果您有任何其他的想法這可減少S3賬單,並防止熱鏈接水蛭反正請分享,即使它們與Rails沒有直接關係。

+0

您目前是否存在瘙癢問題?我不願意做一些會大大減慢我的應用程序的事情,只是爲了解決我未來可能遇到的問題。 – mikerobi 2010-10-27 22:34:22

+0

這不僅是解決潛在問題的問題。我只是不希望有一天以壓倒性的S3賬單醒來,我無力支付......我不太確定,如果這會「顯着」地減緩應用程序的運行速度,那麼當資產將在memcache/reverse代理。 – mdrozdziel 2010-10-28 05:04:32

回答

1

我可能會避免這樣做 - 至少直到我沒有別的選擇。

您需要考慮到,如果您每次下載圖像,您可能還會添加到帶寬帳單。另外,通過腳本處理每個圖像,您還需要更多的CPU和RAM來完成此操作。不是最大的前景 - 恕我直言

對於Amazon S3,我可能會使用enable the access logs,並且編寫一個小工具來分析使用情況,並在使用情況變爲屋頂時更改存儲桶/對象上的權限。每10分鐘左右運行一次cronjob,你應該保存嗎?您也可以使用s3stat。他們還提供免費計劃。

編輯:根據我對Varnish的建議,我添加了一個鏈接到a blog entry about preventing hotlinking using Varnish

+1

我知道當然的缺點,那就是爲什麼我要求解決方案的想法。通常情況並非如此糟糕。請記住,在大多數情況下,圖像可以廣泛兌現。在做一些研究的時候,我認識到,最有效的方法是在S3之前的反向代理,而不是rails應用程序。我也可以做所有事情 - 檢查引用者,做一些大量的日誌分析。這樣的前端將戲劇性地改變S3票據,並且最終的表現不應該更低。 – mdrozdziel 2010-11-02 10:05:58

+0

是的,這聽起來不錯 - 我會推薦清漆。 :)請記住,即使圖像緩存了,也可以通過添加其他服務來運行更多的_complicated_設置。並且可能還需要更多處理能力(例如實例或至少資源)用於代理。 – Till 2010-11-02 14:10:48

4

使用(私人存儲桶|私人文件)並使用簽名的URL來存儲在S3上的文件。

簽名包括到期時間(例如,從現在起10分鐘,無論您想設置什麼)以及加密哈希。如果簽名無效,或者過期時間已過,S3將拒絕提供文件。

這很有用,因爲只有您可以在S3中爲您的私人文件創建有效的URL,並且您可以控制URL保持有效的時間。這可以防止吸血,因爲吸血鬼不能簽署他們自己的URL,如果他們得到了你簽名的URL,那麼URL很快就會過期,之後就不能使用。

5

由於上面沒有提供完整的答案,下面是一個如何對存儲在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 
} 

根據您的Web服務器這可能(雜種)或不得(webrick)方式工作,所以不要,如果不開發流過於沮喪。

1

提供臨時前簽署的網址:

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

所以你卸載從Rails的(這是很慢吧)工作S3還是發佈內容,處理HTTP緩存,HEAD操作,並使用亞馬遜的CDN 。

相關問題