2016-05-03 57 views
0

在我的Rails應用程序中,我想顯示來自AWS S3存儲桶的靜態圖像。所以不需要像Paperclip或Carrierwave這樣的解決方案,因爲不需要上傳。所以我使用aws-sdk gem與S3存儲桶進行交互。設置用於顯示來自Amazon S3的靜態圖像的憑據

這工作(當然)公共圖像罰款,但是當我想要顯示私人圖像時,我得到一個access denied。我設置了以下環境變量:AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY和S3_BUCKET_NAME。

在Heroku上我已經添加了這些環境變量heroku config:set和本地我使用的dotenv寶石。

問題是我仍然有本地和Heroku上的access denied錯誤。這裏有什麼問題?這是視圖(靜態URL,後來這當然是動態的):

= link_to "https://s3-eu-west-1.amazonaws.com/mybucket/Demo/20160503092647717.png" do 
    = image_tag("https://s3-eu-west-1.amazonaws.com/mybucket/Demo/20160503092647717.png", width: '600') 
+0

您是否已將手動上傳的圖片的權限設置爲對任何人都可見? –

回答

0

默認情況下,S3存儲區是PRIVATE,只能通過所有者訪問密鑰訪問。

通過將Principal設置爲「*」並附加到存儲桶策略,可以使存儲桶不需要訪問密鑰而進行公共訪問。

{ 
    "Version":"2012-10-17", 
    "Statement":[ 
    { 
     "Sid":"AddPerm", 
     "Effect":"Allow", 
     "Principal": "*", 
     "Action":["s3:GetObject"], 
     "Resource":["arn:aws:s3:::examplebucket/*"], 
     "Condition": { 
     "IpAddress": {"aws:SourceIp": "54.240.143.0/24"}, 
     "NotIpAddress": {"aws:SourceIp": "54.240.143.188/32"} 
    } 
    } 
    ] 
} 

上面的「條件」可以限制哪個IP地址可以訪問您的S3存儲桶。

有許多方法可以通過嚴格策略和訪問控制授予存儲桶更新或查看權限。您需要閱讀並配置它們。 請在此檢查:S3 example bucket policies

+0

謝謝,我不知道你也可以輕鬆控制亞馬遜方面的訪問。 – John

+0

@John:只要注意AWS的限制,例如源IP的條件限制不適用於VPC私有IP地址。 – mootmoot

0

你解決不了,通過增加您的AWS憑據到服務器。您只向客戶端/瀏覽器發送受保護資源的鏈接。您必須公開資源或增加一點安全性,您可以創建新的訪問密鑰,這些訪問密鑰可以讀取存儲桶並使用AWS JS SDK並向訪問者提供新創建的憑據。

相關問題