使用数据在AWS上上传媒体 - Lambda和S3

时间:2017-07-01 18:09:18

标签: amazon-web-services amazon-s3 aws-lambda amazon-cloudfront

我正在制作一个简单的应用程序,用户可以在其中创建文本帖子,也可以选择包含媒体(目前只提供图片,将来还有视频)。

目前,用户向API网关发送POST请求,该请求调用将后期数据插入数据库的Lambda函数。这非常有效。 API网关使用正文映射来格式化事件数据。

为了上传媒体,我似乎至少有三个选择:

  1. 将HTTP POST请求正常 THEN 将媒体上传到S3(通过Cloudfront?)。

    • S3将触发Lambda函数,该函数使用媒体网址更新帖子记录。
    • 这需要在前端至少进行2次API调用。 -.-
    • 如果媒体上传失败怎么办?我将不得不调用另一个Lambda函数来删除帖子。怎么会失败?这是一个兔子洞。
  2. 将媒体上传到S3(通过Cloudfront?)然后发出HTTP POST请求。

    • 这需要在前端进行2次API调用。 -.-
    • 如果POST请求失败怎么办?我的桶里会有额外的物品。我想我可以有一个桶清理计划任务,但ugg。
    • S3键是否与帖子的id不对应? (id是在数据库插入时生成的。)
  3. 使用POST中的HTTP multipart/form请求上传媒体。

    • 这是我过去的做法,但我也有一个网络服务器(不是lambda)。如果照片不是很大,转移到S3 应该相对较快,我的lambda成本不会太大幅度增加。但是,如果我决定添加视频怎么办?现在我的lambda调用将持续数秒。
  4. 这里的最佳做法是什么?这似乎是一个常见的问题,但我在网上找到的所有指南都不关心发布数据(仅限媒体数据)。

1 个答案:

答案 0 :(得分:1)

(来自评论)

您的对象由两个同等重要的部分(文本和媒体)组成,您希望在一次操作中传输它们以避免一致性问题。

如果您可以将文本限制为少于1024个Unicode字符:将文本放入包含媒体的s3对象的键中。您需要在密钥的前面保留一些字符,即在用户的文本开始之前,因为S3的ListObjects API有一个有用的"前缀"参数,你可以使你的前缀有利于搜索。然后附加一个lambda侦听器以在上载后创建数据库条目。

如果您的帖子超过1000多个字符:那么是的,您需要两个操作和一个清理过程来捕获失败的那些。 S3的对象过期应该有助于清理你将首先上传的媒体部分(你的选项#2),你当然会在你的帖子上成功提交文本部分后将媒体从自动过期的存储桶中移出

很高兴得到帮助