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),您当然会在成功提交文章中的文本部分时将媒体移出自动过期的存储桶。

很乐意帮忙