如何在 Amazon s3 存储桶中压缩文件并获取其 URL

我在Amazon s3存储桶中有一堆文件,我想压缩这些文件并使用Java Spring通过S3 URL下载获取内容。


答案 1

S3 不是文件服务器,也不提供操作系统文件服务,例如数据操作。

如果有很多“巨大”文件,你最好的选择是

  1. 启动一个简单的 EC2 实例
  2. 将所有这些文件下载到 EC2 实例,压缩它们,然后使用新对象名称将其重新上传回 S3 存储桶

是的,您可以使用 AWS lambda 执行相同的操作,但 lambda 有 900 秒(15 分钟)执行超时的限制(因此建议分配更多 RAM 以提高 lambda 执行性能)

从S3到本地区域EC2实例等服务的流量是免费的。

如果您的主要目的只是使用 EC2/etc 服务在同一 AWS 区域内读取这些文件,则不需要此额外步骤。只需直接访问文件即可。

(更新):正如@Robert Reiz 所提到的,现在您还可以使用 AWS Fargate 来完成这项工作。

注意:

建议使用 AWS API 访问和共享文件。如果您打算公开共享文件,则必须认真研究安全问题并施加下载限制。AWS流向互联网的流量从来都不便宜。


答案 2

将它们压缩到您的末端,而不是在AWS中执行此操作,最好是在前端,直接在用户浏览器上。您可以在javascript中流式传输多个文件的下载,使用该流创建一个zip并将此zip保存在用户磁盘上。

将拉链移动到前端的优点:

  • 您可以将其与S3 URL,一堆预签名链接一起使用,甚至可以混合来自不同来源的内容,其中一些来自S3,一些其他地方。
  • 您不会浪费 lambda 内存,也不必启动 EC2 fargate 实例,从而节省资金。让用户计算机为您完成此操作。
  • 改善了用户体验 - 无需等待创建zip即可开始下载,只需在创建zip的同时开始下载即可。

StreamSaver对于此目的很有用,但是在他们的压缩示例(将多个文件另存为zip)中受到少于4GB文件的限制,因为它没有实现zip64。您可以将StreamSaver与支持zip64的客户端zip组合在一起,如下所示(我还没有测试过):

import { downloadZip } from 'client-zip';
import streamSaver from 'streamsaver';
const files = [
  {
    'name': 'file1.txt',
    'input': await fetch('test.com/file1')
  },
  {
    'name': 'file2.txt',
    'input': await fetch('test.com/file2')
  },
]
downloadZip(files).body.pipeTo(streamSaver.createWriteStream('final_name.zip'));

如果您选择此选项,请记住,如果您在存储桶中启用了 CORS,则需要在存储桶的 CORS 配置字段中添加完成压缩的前端 URL。AllowedOrigins


推荐