我正在制作一个简单的应用程序,用户可以在其中创建文本帖子,也可以选择包含媒体(目前只提供图片,将来还有视频)。
目前,用户向API网关发送POST
请求,该请求调用将后期数据插入数据库的Lambda函数。这非常有效。 API网关使用正文映射来格式化事件数据。
为了上传媒体,我似乎至少有三个选择:
将HTTP POST
请求正常 THEN 将媒体上传到S3(通过Cloudfront?)。
将媒体上传到S3(通过Cloudfront?)然后发出HTTP POST
请求。
POST
请求失败怎么办?我的桶里会有额外的物品。我想我可以有一个桶清理计划任务,但ugg。 id
不对应? (id
是在数据库插入时生成的。)使用POST
中的HTTP multipart/form
请求上传媒体。
这里的最佳做法是什么?这似乎是一个常见的问题,但我在网上找到的所有指南都不关心发布数据(仅限媒体数据)。
答案 0 :(得分:1)
(来自评论)
您的对象由两个同等重要的部分(文本和媒体)组成,您希望在一次操作中传输它们以避免一致性问题。
如果您可以将文本限制为少于1024个Unicode字符:将文本放入包含媒体的s3对象的键中。您需要在密钥的前面保留一些字符,即在用户的文本开始之前,因为S3的ListObjects API有一个有用的"前缀"参数,你可以使你的前缀有利于搜索。然后附加一个lambda侦听器以在上载后创建数据库条目。
如果您的帖子超过1000多个字符:那么是的,您需要两个操作和一个清理过程来捕获失败的那些。 S3的对象过期应该有助于清理你将首先上传的媒体部分(你的选项#2),你当然会在你的帖子上成功提交文本部分后将媒体从自动过期的存储桶中移出
很高兴得到帮助