我正在製作一個簡單的應用程序,用戶可以在其中創建文本文章並可選擇包含媒體(僅限現在使用,但未來使用視頻)。在AWS上使用數據進行媒體上傳 - Lambda和S3
當前,用戶向API網關發送POST
請求,該請求調用將發佈數據插入數據庫的Lambda函數。這很好。 API網關使用正文映射格式化事件數據。
爲了上傳媒體,看來我至少有三種選擇:(?通過的Cloudfront)
充分利用HTTP請求
POST
正常THEN上傳媒體S3。- S3會觸發一個Lambda函數,用媒體URL更新帖子記錄。
- 這將需要在前端至少2個API調用。 -.-
- 如果媒體上傳失敗怎麼辦?我將不得不調用另一個Lambda函數來刪除帖子。如果失敗了呢?這是一個兔子洞。
上傳媒體S3(經由的Cloudfront?)THEN使HTTP
POST
請求。- 這需要在前端進行2個API調用。 -.-
- 如果
POST
請求失敗,該怎麼辦?我的桶裏會有額外的物體。我想我可以有一個桶清理計劃任務,但ugg。 - S3密鑰是否與帖子的
id
不一致? (id
上數據庫插入生成的。)
上傳媒體與
multipart/form
的HTTP請求POST
。- 這就是我過去的做法,但我也有一個Web服務器(不是lambda)。如果照片不是很大,轉移到S3 應該相對較快,我的lambda成本不會太劇增。但是如果我決定添加視頻呢?現在我的lambda調用會持續數秒。
這裏的最佳做法是什麼?這似乎是一個常見問題,但我在網上找到的所有指南都不關注發佈數據(僅限媒體數據)。
出於好奇,你爲什麼要涉及API網關?爲什麼不使用AWS的SDK調用你的lambda?無論如何,我會選擇選項(1),即首先創建帖子,因爲它聽起來像用戶想要創建的實際對象。而且,如果您的媒體上傳失敗,您只需將此錯誤回傳至用戶界面,並要求他們再次上傳。爲什麼要刪除帖子? –
好問題。我想分離的擔憂。前端完全沒有後端改造其功能。現在我認爲這可能會與版本控制混淆。它很有趣,你選擇了那個,因爲我認爲(2)會是最好的。媒體似乎具有同等重要性。在(1)中,獲取新創建帖子的用戶可以在沒有他們的媒體的情況下獲得帖子 – woodpav
我明白了,所以你的對象是由兩個同樣重要的部分(文本和媒體)組成的,你希望通過一次操作來傳輸它們以避免一致性問題。如果您可以將文本限制爲少於1024個Unicode字符,請將文本放入包含媒體的s3對象的鍵中。您將希望在鍵的前面(即在用戶的文本開始之前)保留一些字符,因爲S3的ListObjects API具有有用的「前綴」參數,並且可以使前綴有助於搜索。然後附加一個lambda監聽器,在上傳後創建數據庫條目*。 –