如何使用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
相关产品推荐
相关产品推荐

