上传到 S3 之前的 AWS 临时文件?

Posted

技术标签:

【中文标题】上传到 S3 之前的 AWS 临时文件?【英文标题】:AWS temporary files before uploading to S3? 【发布时间】:2017-12-14 20:11:04 【问题描述】:

我的 Laravel 应用允许用户上传图片。目前,当用户上传他们的图像时,它们会存储在服务器上的一个临时位置。一个 cron 作业然后修改上传的图像(压缩它们等),并将它们上传到 S3。任何超过 48 小时且未能上传到 S3 的临时文件都会被另一个 cron 作业删除。

我已经设置了 Elastic Beanstalk 环境,但我突然想到将上传的图像存储在实例上的临时目录中是有风险的,因为可以在必要时创建和销毁实例。

那么,我将如何以及在何处存储这些临时文件,以免它们有被实例删除的风险?

【问题讨论】:

我碰巧现在正在处理完全相同的问题。我们不能使用 AWS 开发工具包将初始上传指向 S3 存储桶,而不是我们的服务器吗?然后 cron 作业在这个“临时”S3 存储桶上工作,最后上传到永久 S3 存储桶。 这可行,但我正在寻找一种方法来避免将临时文件上传到 S3,如果可能的话(以避免相关成本)。 啊,使用 Elastic Beanstalk扩展和故障恢复的好处。该文件必须放在某个地方,其他选项将是由您直接控制的独立 ec2 实例(因此您知道它不会被关闭),文件托管服务,例如imgur 也许?,但这些当然也有相关的成本。 我所做的所有研究都指向必须使用 S3,因此除非有人另有说明,否则我很可能不得不使用它。绝对不想使用其他文件托管服务...感觉很脏。 考虑将原件直接上传到 S3,这样您就不必通过服务器代理上传。还可以考虑使用基于事件的 Lambda 函数将图像从其原始源格式和位置转换为您想要的格式和位置。 【参考方案1】:

S3 有一个名为 object lifecycle management 的功能,您可以通过将文件设置为在上传后 2 天过期来自动删除文件。

您可以:

A) 为临时文件添加前缀以将它们放入 S3 伪文件夹(即Temp/),将对象生命周期过期规则应用于该特定前缀(或“文件夹”),并将其中的文件用作操作后衍生的新文件的真实来源。

B) 专门为临时文件创建一个 S3 存储桶。从那里操作文件并复制到生产存储桶。

【讨论】:

【参考方案2】:

正如 cmets 中所讨论的,我认为将文件上传到 S3 是最佳选择。据我所知,无法阻止 Elastic Beanstalk 销毁 ec2 实例,除非您想摆脱所有扩展和实例故障/自动替换功能。

我不太了解的一个选项可能是 AWS EBS。 “Amazon Elastic Block Store (Amazon EBS) 提供持久的块存储卷,用于 AWS 云中的 Amazon EC2 实例。”我对 EBS 没有任何直接经验,最重要的问题当然是 EBS 是否真正持久,即使在 ec2 实例被销毁之后也是如此。由于 EBS 有与之相关的成本,看起来既然您已经在使用 S3,那么 S3 将是可行的方法。

【讨论】:

如果有人能解释一下 S3 和 EBS 之间的区别,哪一个最适合我的情况,请做。 @user1465627 对象存储与块存储。见cloudberrylab.com/blog/amazon-s3-vs-amazon-ebs。在您的情况下,您可能应该使用 S3。

以上是关于上传到 S3 之前的 AWS 临时文件?的主要内容,如果未能解决你的问题,请参考以下文章

将文件上传并压缩到s3

AWS DMS Redshift 作为目标

在使用 PHP 上传到临时目录之前检查图像的文件大小

如何使用 aws-sdk 将文件同步上传到 S3?

在 PHP 将文件上传到临时文件夹之前检查文件类型(FLV),方法是只读取文件的开头 3 个字节

Powershell:使用临时凭证访问AWS s3存储桶