2016-08-30 84 views
0

我有一個由AWS(EC2和其他服務)支持的iOS應用程序。但是我有一個關於將用戶生成的文件(如圖像和視頻)上傳到後端的問題。我正在考慮將它們直接上傳到S3存儲桶或上傳到EC2,並讓EC2將它們傳遞到S3存儲桶。我傾向於上傳到EC2,因爲我不希望任何人對我的文件系統有寫入權限,但是,這可能需要我的EC2實例大量繁重工作。如果我直接上傳到S3,我如何確保安全性,而不使用臨時URL(我使用SDWebImage下載和緩存圖像,臨時URL會導致SDWebImage下載相同的圖像,而不是從本地檢索)?任何建議將不勝感激。使用AWS EC2 Endpoint或S3的iOS

回答

0

所以你要通過Lambda去耦這個。

請勿使用EC2。沒有必要。

創建一個S3桶被稱爲 「應用程序,無論」

保持你的水桶PRIVATE。您不必爲用戶提供訪問權限。他們可以使用生成的URL進行保密。讓每個用戶都有自己的文件夾(這是前綴)。

看上去很花哨,從用戶端放入S3的每一項。使用ios'arc4'公式隨機生成每個密鑰或任何你想要的,然後附加文件類型。因此,blahblab.png

將元數據字段放入名爲thumbnail的文件以及文件名的值加上-thumb。所以blahblah-thumb.png

回顧:您正在上傳一個文件到S3,元數據字段爲thumbnail。而已。

然後創建一個Lambda函數來響應S3中的每個PUT文件。如果你喜歡Node.JS,可以使用imagemagick模塊(很適合你)來生成一個128x128的縮略圖或其他東西。 lambda函數接收文件的S3數據。獲取源文件的主文件(鍵名),縮略圖元數據將成爲輸出。運行您的IM功能並將輸出文件放入S3存儲桶中。現在你有兩個文件在桶中。大。

現在,當你列出這些文件,不要下載每一個。從文件獲取元數據並獲取元數據中的密鑰的presignedUrl

這將會很快。例如,在App Store上查看iSkore的高清攝像頭。

+0

如果S3存儲區是私人的,我怎樣才能使用SDWebImage與網址下載圖片?訪問將被拒絕否? – jackson

+0

您打電話給's3.getSignedUrl',它爲您提供了一個臨時鏈接,您提供給SDWebImage – iSkore

+0

我明白了。那個鏈接每次改變都正確嗎? SDWebImage如何緩存圖像呢?因爲我認爲SDWebImage使用url作爲從磁盤和內存查詢的關鍵字,如果URL更改,關鍵字也會隨之更改。然後SDWebImage會認爲它從來沒有得到這個圖像,所以它會從互聯網上下載它。 – jackson

0

這真的取決於你的限制原因。如果您授予應用程序將圖像上傳到您的EC2服務器的權限,然後將其轉發給S3,那麼您獲得的是什麼? S3允許您使用重要的預先修訂來限制基於用戶的對象(如果您使用Cognito進行身份驗證,這很容易)。例如,你可以這樣做,所以你的S3結構就像/images/{userId}/myImage.jpg,每個用戶只能上傳到他們的文件夾。你可以把它完全私人的,也可以讓其他用戶從該文件夾讀不能寫等...

的幾點思考: - 你可以黑名單用戶潛在 - 你可以限制請求,或檢查和拒絕某些圖像 - 您可以擁有比S3提供的更復雜的安全模型

您可以使用API​​ Gateway作爲前兩種用例。

如果您確實想使用ec2,那麼預簽名的URL將會更改。我不確定SDWebImage是如何工作的,所以我不能評論它的緩存能力。