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

如何使用Java AWS Lambda存储文件到AWS S3?已创建S3桶及IAM用户并授权

嘿,看起来你已经把基础资源都准备得妥妥当当——S3桶、IAM用户还有对应的权限,接下来咱们一步步搞定用Java Lambda把文件传到S3的事儿!

步骤1:给Lambda配置执行角色(关键环节!)

虽然你已经有了带权限的IAM用户,但Lambda本身得用执行角色来获取AWS服务的访问凭证。你需要把那个S3AccessPermision权限策略附加到Lambda的执行角色上,或者直接确保该策略包含s3:PutObject动作(目标是你的S3桶,比如资源设为arn:aws:s3:::你的桶名/*)。

步骤2:搭建Java Lambda项目

用Maven或Gradle都可以,这里以Maven为例,先在pom.xml里添加AWS SDK依赖(推荐用v2版本,v1已经逐步淘汰了):

<dependencies>
    <!-- Lambda核心依赖 -->
    <dependency>
        <groupId>software.amazon.awssdk</groupId>
        <artifactId>lambda</artifactId>
        <version>2.20.0</version>
    </dependency>
    <!-- S3 SDK依赖 -->
    <dependency>
        <groupId>software.amazon.awssdk</groupId>
        <artifactId>s3</artifactId>
        <version>2.20.0</version>
    </dependency>
    <!-- 可选:如果要处理API Gateway触发的上传请求 -->
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-lambda-java-events</artifactId>
        <version>3.11.0</version>
    </dependency>
</dependencies>
步骤3:编写Lambda函数代码

这里分两种常见场景给你示例:

场景1:上传字符串/简单内容到S3

适合直接生成内容上传的场景:

import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
import software.amazon.awssdk.core.sync.RequestBody;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import java.nio.charset.StandardCharsets;
import java.util.Map;

public class S3UploadHandler implements RequestHandler<Map<String, String>, String> {

    // 初始化S3客户端,Lambda会自动用执行角色的凭证
    private final S3Client s3Client = S3Client.builder()
            .region(Region.US_EAST_1) // 替换成你的桶所在区域
            .build();

    @Override
    public String handleRequest(Map<String, String> input, Context context) {
        String bucketName = "你的桶名";
        String s3Key = "test-file.txt"; // 上传到S3后的文件名/键
        String fileContent = "这是Java Lambda上传的文件内容!";

        try {
            PutObjectRequest uploadRequest = PutObjectRequest.builder()
                    .bucket(bucketName)
                    .key(s3Key)
                    .build();

            // 上传字符串内容
            s3Client.putObject(uploadRequest, RequestBody.fromString(fileContent, StandardCharsets.UTF_8));

            context.getLogger().log("文件上传成功!S3键:" + s3Key);
            return "上传完成,文件键:" + s3Key;
        } catch (Exception e) {
            context.getLogger().log("上传失败:" + e.getMessage());
            throw new RuntimeException("文件上传失败", e);
        }
    }
}

场景2:处理API Gateway传来的二进制文件

如果你的Lambda是通过API Gateway接收前端上传的文件,用这个示例:

import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
import software.amazon.awssdk.core.sync.RequestBody;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent;
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent;
import java.util.Base64;

public class S3BinaryUploadHandler implements RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> {

    private final S3Client s3Client = S3Client.builder()
            .region(Region.US_EAST_1)
            .build();

    @Override
    public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent input, Context context) {
        APIGatewayProxyResponseEvent response = new APIGatewayProxyResponseEvent();
        String bucketName = "你的桶名";
        String s3Key = "uploaded-file-" + System.currentTimeMillis() + ".bin"; // 用时间戳避免重名

        try {
            // 解码API Gateway传来的Base64二进制数据
            byte[] fileBytes = Base64.getDecoder().decode(input.getBody());

            PutObjectRequest uploadRequest = PutObjectRequest.builder()
                    .bucket(bucketName)
                    .key(s3Key)
                    .build();

            s3Client.putObject(uploadRequest, RequestBody.fromBytes(fileBytes));

            response.setStatusCode(200);
            response.setBody("文件上传成功,S3键:" + s3Key);
            return response;
        } catch (Exception e) {
            context.getLogger().log("上传失败:" + e.getMessage());
            response.setStatusCode(500);
            response.setBody("上传失败:" + e.getMessage());
            return response;
        }
    }
}
步骤4:打包部署Lambda

用Maven打包成Jar包:

mvn clean package

然后把target目录里的Jar包上传到Lambda控制台,或者用AWS CLI部署。部署时注意:

  • 处理程序设置为你的类全路径,比如com.example.S3UploadHandler::handleRequest
  • 执行角色选择你之前配置好的、带有S3AccessPermision权限的角色
步骤5:测试Lambda函数

在Lambda控制台创建测试事件,比如对第一个示例,测试事件可以是:

{
  "bucketName": "你的桶名",
  "key": "test-file.txt"
}

执行测试后,去你的S3桶里看看有没有对应的文件就好啦!

几个重要注意事项
  • 区域匹配:S3客户端的区域必须和你的桶所在区域一致,否则会报错
  • 权限验证:确认Lambda执行角色的权限策略里,s3:PutObject的资源范围包含你的桶(比如arn:aws:s3:::你的桶名/*)
  • 临时存储:Lambda的/tmp目录最多有512MB空间,上传大文件建议用分段上传,或者直接处理数据流避免占用临时存储
  • SDK版本:尽量用AWS SDK v2,性能更好且是官方主推版本

内容的提问来源于stack exchange,提问作者Ramesh_Ron

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 06:33:12