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

Media upload on AWS with data - Lambda and S3

我正在制作一个简单的应用程序,用户可以在其中创建文本 post 并可选择包含媒体(目前仅包含图片,但将来会包含视频)。

目前,用户向 API 网关发送 POST 请求,调用 Lambda 函数将 post 数据插入数据库。这很好用。 API Gateway 使用正文映射来格式化事件数据。

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

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

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

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

    • 这就是我过去的做法,但我也有一个网络服务器(不是 lambda)。如果照片不是很大,传输到 S3 应该 相对较快并且我的 lambda 成本不会增加太多。但是,如果我决定添加视频怎么办?现在我的 lambda 调用将持续几秒钟。

此处的最佳做法是什么?这似乎是一个常见问题,但我在网上找到的所有指南都不关心 post 数据(仅媒体数据)。

(来自评论)

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

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

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

很高兴为您提供帮助