AWS S3 的小文件问题

SUD*_*HAN 6 amazon-s3 amazon-web-services

我有一个应用程序,其中

每天会生成 100 万到 1 亿个甚至更多的小 xml 文件,我必须将其加载到 S3 存储桶之一中,就像仅加载单个 xml 文件一样。该 S3 存储桶链接到 CloudFront,以便我们世界各地的客户可以更快地访问 xml 文件。

除了成本部分之外,一切对我来说都很好。随着文件数量的增加,S3 put 请求的成本每天都在增加。文件应在出现后立即推送,并且应可从 cloudFront 访问。

有什么解决方案可以节省我的成本吗?xml 文件的大小最大为 2 kb。

让我在这里详细阐述我迄今为止尝试过的一些要点。我想在本地合并所有小 xml,然后将其推送到 S3,但问题是我们应该在 AWS 中进行一些计算,以将其再次提取到小文件中,因为最终用户只接受单独的 xml 文件。提取并创建小文件并再次保存到 S3 中的成本会更高。

因此,请随意建议一些可能适合此用例的其他系统,而不是 S3。我也尝试过 HBASE,但在 AWS 中运行和管理 HBASE 是一个问题。我们还尝试了 Dynamo DB,但成本也更高。

小智 0

API 调用按每个对象收费,无论其大小如何。上传 1 字节的费用与上传 1GB 的费用相同。所以通常小对象会导致 API 成本飙升。

在以下场景中,您可以批量处理多个对象并将其作为单个文件上传到 S3 存储桶。

接下来,您需要编写一个 Lambda 函数(无服务器架构)来将上传的文件解压到同一个存储桶中。

由于您已经提到所有最终用户都将仅访问 XML 文件。因此,您应该上传一个批处理文件并使用 Lambda 函数将所有文件提取到同一个存储桶中。

这将为您节省 PUT 数据传输成本。

用于解压的 Lambda 示例代码

  • @YashBindlish 你的解决方案比直接写入较小的文件更好吗?最后,您仍然发出“PUT”请求以使用 Lambda 写入解压缩的文件。它应该仍然花费相同的费用,或者我错过了什么? (5认同)
  • 那么你是说将许多小xml文件压缩成一个,然后上传到S3,一旦上传就启动lambda,它将解压缩成小文件......但是当我们解压缩时,它会再次创建小文件,这也是一个put仅请求,即使它是同一个存储桶。 (2认同)
  • 所以实际上没有传输成本或者可以忽略不计将数据放入 S3。所以传输成本在这里不是问题,甚至存储也不是很多,因为我们的 xml 文件非常少,一天几乎没有 5 GB。真正的问题是请求进入S3。 (2认同)
  • 将小文件(小于 128kB)移至不频繁访问类别实际上会增加成本,因为 IA 中的文件在存储时按最小 128kb 大小计费。因此,在 5 个文件(每个文件 10kB)的标准类别中,您将需要支付 50kB 的存储费用,在 IA 中,这将是 640。 (2认同)