0

我正在製作一個簡單的應用程序,用戶可以在其中創建文本文章並可選擇包含媒體(僅限現在使用,但未來使用視頻)。在AWS上使用數據進行媒體上傳 - Lambda和S3

當前,用戶向API網關發送POST請求,該請求調用將發佈數據插入數據庫的Lambda函數。這很好。 API網關使用正文映射格式化事件數據。

爲了上傳媒體,看來我至少有三種選擇:(?通過的Cloudfront)

  1. 充分利用HTTP請求POST正常THEN上傳媒體S3。

    • S3會觸發一個Lambda函數,用媒體URL更新帖子記錄。
    • 這將需要在前端至少2個API調用。 -.-
    • 如果媒體上傳失敗怎麼辦?我將不得不調用另一個Lambda函數來刪除帖子。如果失敗了呢?這是一個兔子洞。
  2. 上傳媒體S3(經由的Cloudfront?)THEN使HTTP POST請求。

    • 這需要在前端進行2個API調用。 -.-
    • 如果POST請求失敗,該怎麼辦?我的桶裏會有額外的物體。我想我可以有一個桶清理計劃任務,但ugg。
    • S3密鑰是否與帖子的id不一致? (id上數據庫插入生成的。)
  3. 上傳媒體與multipart/form的HTTP請求POST

    • 這就是我過去的做法,但我也有一個Web服務器(不是lambda)。如果照片不是很大,轉移到S3 應該相對較快,我的lambda成本不會太劇增。但是如果我決定添加視頻呢?現在我的lambda調用會持續數秒。

這裏的最佳做法是什麼?這似乎是一個常見問題,但我在網上找到的所有指南都不關注發佈數據(僅限媒體數據)。

+0

出於好奇,你爲什麼要涉及API網關?爲什麼不使用AWS的SDK調用你的lambda?無論如何,我會選擇選項(1),即首先創建帖子,因爲它聽起來像用戶想要創建的實際對象。而且,如果您的媒體上傳失敗,您只需將此錯誤回傳至用戶界面,並要求他們再次上傳。爲什麼要刪除帖子? –

+0

好問題。我想分離的擔憂。前端完全沒有後端改造其功能。現在我認爲這可能會與版本控制混淆。它很有趣,你選擇了那個,因爲我認爲(2)會是最好的。媒體似乎具有同等重要性。在(1)中,獲取新創建帖子的用戶可以在沒有他們的媒體的情況下獲得帖子 – woodpav

+1

我明白了,所以你的對象是由兩個同樣重要的部分(文本和媒體)組成的,你希望通過一次操作來傳輸它們以避免一致性問題。如果您可以將文本限制爲少於1024個Unicode字符,請將文本放入包含媒體的s3對象的鍵中。您將希望在鍵的前面(即在用戶的文本開始之前)保留一些字符,因爲S3的ListObjects API具有有用的「前綴」參數,並且可以使前綴有助於搜索。然後附加一個lambda監聽器,在上傳後創建數據庫條目*。 –

回答

1

(從評論)

你的對象是由兩個同樣重要的部分(文本和媒體),你想運送他們在一個單一的操作,以避免一致性問題。

如果您可以將文本限制爲少於1024個Unicode字符:將文本放入包含媒體的s3對象的鍵中。您需要在鍵的前面保留一些字符,即在用戶的文本開始之前,因爲S3的ListObjects API有一個有用的「前綴」參數,並且可以使前綴有助於搜索。然後附加一個lambda監聽器以在上傳後創建數據庫條目。

如果你的帖子超過1000多個字符,那麼是的,你需要兩個操作和一個清理過程來捕獲那些失敗的。 S3的對象過期應該有助於清理您首先上傳的媒體部分(您的選項#2),您當然會在成功提交文章中的文本部分時將媒體移出自動過期的存儲桶。

很樂意幫忙