如何解压S3内的ZIP文件并重压缩为gz格式转存至其他S3存储桶
服务选型结论
该场景优先选用 Lambda + S3事件触发 作为核心实现方案,单Zip体积小于500MB、解压后单个文件小于2GB的场景可完全适配;如果你的Zip包普遍大于500MB、或单Zip内包含上千个小文件,可额外搭配S3 Batch Operations或Glue Job处理存量/超大文件任务。
不建议直接全量使用Glue Job实现:Glue更适合大规模批量ETL、结构化数据处理场景,你的需求属于纯二进制文件的解压重压缩,是典型的轻量级IO密集型任务,使用Glue成本更高,增量触发逻辑也更繁琐,远不如Lambda的S3事件触发直接。
完整实现逻辑
- 触发层:给源S3桶配置
s3:ObjectCreated:*事件通知,新增Zip文件时自动触发Lambda函数 - 核心处理逻辑(Lambda侧):
- 从事件参数中获取源桶名、Zip对象Key,优先用流式方式读取Zip文件,无需全量下载到本地,避免占用Lambda
/tmp临时目录空间(Lambda临时目录最大容量为10GB) - 流式解压Zip包,遍历每个内部文件,边读取边用gzip压缩为
$file.gz格式 - 压缩后的文件直接流式上传到目标S3桶,无需落地本地磁盘
- 从事件参数中获取源桶名、Zip对象Key,优先用流式方式读取Zip文件,无需全量下载到本地,避免占用Lambda
- 兜底机制:如果遇到超大Zip包(>10GB)或者超过Lambda最长15分钟执行时长无法处理的任务,将任务信息推到SQS队列,触发Glue Job异步批量处理
核心注意事项
- Lambda配置建议:内存配置到2048MB以上,对应CPU和网络带宽都会有明显提升,可大幅加快压缩处理速度,超时时间按需配置到最长15分钟
- 存量文件处理:可调用S3清单功能批量触发Lambda,或用S3 Batch Operations批量提交任务,无需自行编写桶遍历逻辑
- 异常重试:配置死信队列(DLQ),处理失败的Zip文件事件会推送到DLQ,方便后续人工排查和重试
Terraform编排核心资源清单
你需要在Terraform中定义以下核心资源即可实现全链路编排:
- 源S3桶、目标S3桶(按需开启版本控制、服务端加密配置)
- Lambda执行IAM角色,需包含S3读写权限、CloudWatch日志写入权限
- Lambda函数代码包(可将Python处理代码打包为Zip上传,或用Terraform
archive_file数据源自动打包) - S3桶事件通知配置,关联源桶的ObjectCreated事件到Lambda函数
- 可选资源:SQS队列、Glue Job(用于兜底超大文件/存量批量处理场景)
Glue Job适配场景说明
如果你确实需要使用Glue Job实现,仅建议匹配以下场景:
- 存量Zip文件总容量超过10TB,单Zip包普遍大于10GB
- 需求以批量定时处理全桶Zip文件为主,而非仅处理增量新增文件
Glue Job可选用Python Shell模式,处理代码和Lambda逻辑完全一致,无需启用Spark集群,成本远低于Spark集群模式,触发可搭配EventBridge定时调度或SQS消息触发实现。
内容的提问来源于stack exchange,提问作者x89
相关产品推荐
相关产品推荐

