You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在AWS Lambda中用Java压缩S3存储桶内文件为.gz格式

嗨,我来帮你搞定这个需求!既然你是用Eclipse的AWS Toolkit开发Lambda,又不想依赖AWS CLI,完全可以直接在Lambda代码里结合AWS SDK和Java原生压缩工具来实现S3文件的GZIP压缩。下面是具体的步骤和代码示例,一步步来就行:

实现方案:Lambda中直接压缩S3文件为.gz格式

1. 配置项目依赖

首先确保你的Lambda项目里包含AWS SDK for S3的依赖,如果用Maven管理项目,在pom.xml里添加:

<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>s3</artifactId>
    <version>2.20.0</version> <!-- 建议使用最新稳定版 -->
</dependency>
<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>regions</artifactId>
    <version>2.20.0</version>
</dependency>

Gradle项目的话,对应在build.gradle里添加依赖即可。

2. 核心代码实现

下面是Lambda的处理类,逻辑很清晰:读取指定S3桶的源文件,用GZIP压缩后,再上传回S3(示例里是同一个桶,给文件名加上.gz后缀)。

import software.amazon.awssdk.core.ResponseInputStream;
import software.amazon.awssdk.core.sync.RequestBody;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.GetObjectRequest;
import software.amazon.awssdk.services.s3.model.PutObjectRequest;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;

public class S3GzipCompressionLambda {

    // 初始化S3客户端,Lambda会自动通过IAM角色获取权限,不用硬编码密钥
    private static final S3Client s3Client = S3Client.builder()
            .region(Region.US_EAST_1) // 替换成你的S3桶所在区域
            .build();

    public void handleRequest(String input) {
        // 这里可以把input改成JSON格式,传入桶名、源文件名等参数,示例先简化为硬编码
        String bucketName = "your-source-bucket";
        String sourceKey = "original-file.txt";
        String targetKey = "original-file.txt.gz";

        try {
            // 1. 从S3读取源文件内容
            GetObjectRequest getReq = GetObjectRequest.builder()
                    .bucket(bucketName)
                    .key(sourceKey)
                    .build();
            ResponseInputStream<?> inputStream = s3Client.getObject(getReq);

            // 2. 将文件内容压缩为GZIP格式
            byte[] compressedData = compressToGzip(inputStream.readAllBytes());

            // 3. 上传压缩后的文件到S3,记得设置Content-Encoding方便后续访问自动解压
            PutObjectRequest putReq = PutObjectRequest.builder()
                    .bucket(bucketName)
                    .key(targetKey)
                    .contentEncoding("gzip")
                    .build();
            s3Client.putObject(putReq, RequestBody.fromBytes(compressedData));

            System.out.println("压缩完成!文件已上传至: s3://" + bucketName + "/" + targetKey);
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("S3文件压缩失败: " + e.getMessage());
        }
    }

    // 私有工具方法:把字节数组压缩成GZIP格式
    private byte[] compressToGzip(byte[] rawData) throws IOException {
        ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream();
        try (GZIPOutputStream gzipOutStream = new GZIPOutputStream(byteOutStream)) {
            gzipOutStream.write(rawData);
        }
        return byteOutStream.toByteArray();
    }
}

3. 关键注意事项

  • IAM权限配置:一定要给Lambda的执行角色加上s3:GetObject和s3:PutObject权限,示例策略如下:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::your-source-bucket/*"
        }
    ]
}
  • 大文件优化:如果处理的是超大文件,别直接把整个文件读进内存,改用流式处理——直接把S3的输入流接入GZIP输出流,再通过TransferManager分块上传到S3,避免内存溢出。
  • Lambda配置调整:根据文件大小调整Lambda的内存(内存越高CPU性能越好)和超时时间,防止执行超时。

4. 部署与测试

用Eclipse的AWS Toolkit直接把这个Lambda函数部署到AWS,配置好触发方式(比如S3上传触发,或者手动触发)。测试的时候上传一个文件到指定S3桶,触发Lambda后检查桶里是否生成了对应的.gz文件就行。

内容的提问来源于stack exchange,提问作者Sumeet Kumar Tiwari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:47:36