Spring Boot中AWS S3文件上传报错及配置示例求助
问题分析
报错核心是AWS凭证加载失败,SDK遍历了所有默认凭证提供者链,均未找到有效凭证,导致无法建立与S3服务的连接。
解决方案
1. 凭证配置的几种有效方式
方式一:Spring Boot配置文件(推荐)
在application.yml中添加AWS配置:
aws: access-key: 你的AWS_ACCESS_KEY secret-key: 你的AWS_SECRET_KEY region: 你的AWS区域 # 例如ap-southeast-1、us-east-1 s3: bucket: 目标桶名称
方式二:本地AWS凭证文件
在用户目录下创建.aws/credentials文件(Windows路径:C:\Users\<用户名>\.aws\credentials;Linux/macOS路径:~/.aws/credentials),内容如下:
[default] aws_access_key_id = 你的AWS_ACCESS_KEY aws_secret_access_key = 你的AWS_SECRET_KEY
同时创建.aws/config文件指定区域:
[default] region = 你的AWS区域
方式三:代码显式指定凭证(仅适合测试场景)
直接在代码中传入凭证信息,生产环境不建议使用。
完整示例代码
1. AWS S3配置类(Spring Boot)
import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.transfer.s3.S3TransferManager; @Configuration public class AwsS3Config { @Value("${aws.access-key}") private String accessKey; @Value("${aws.secret-key}") private String secretKey; @Value("${aws.region}") private String region; @Bean public S3Client s3Client() { AwsBasicCredentials credentials = AwsBasicCredentials.create(accessKey, secretKey); return S3Client.builder() .credentialsProvider(StaticCredentialsProvider.create(credentials)) .region(Region.of(region)) .build(); } @Bean public S3TransferManager s3TransferManager() { return S3TransferManager.builder() .s3Client(s3Client()) .build(); } }
2. 文件上传服务类
import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import software.amazon.awssdk.transfer.s3.FileUpload; import software.amazon.awssdk.transfer.s3.S3TransferManager; import software.amazon.awssdk.transfer.s3.UploadFileRequest; import software.amazon.awssdk.transfer.s3.progress.LoggingTransferListener; import java.nio.file.Paths; @Service public class S3FileUploadService { private final S3TransferManager transferManager; @Value("${aws.s3.bucket}") private String bucketName; public S3FileUploadService(S3TransferManager transferManager) { this.transferManager = transferManager; } public void uploadFile(String localFilePath, String s3Key) { UploadFileRequest uploadFileRequest = UploadFileRequest.builder() .putObjectRequest(req -> req.bucket(bucketName).key(s3Key)) .addTransferListener(LoggingTransferListener.create()) .source(Paths.get(localFilePath)) .build(); FileUpload upload = transferManager.uploadFile(uploadFileRequest); // 等待上传完成 upload.completionFuture().join(); } }
3. Maven依赖配置
<dependencies> <!-- Spring Boot Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- AWS S3 SDK --> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3</artifactId> </dependency> <!-- S3 Transfer Manager --> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3-transfer-manager</artifactId> <version>2.20.131</version> <!-- 使用与SDK兼容的最新版本 --> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>2.20.131</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
注意事项
- 生产环境禁止硬编码凭证,优先使用IAM角色(部署在ECS/EKS/EC2时)或环境变量注入凭证。
- 确保AWS账号拥有目标S3桶的
PutObject权限,避免权限不足报错。 - 如果使用SSO凭证,需添加
sso模块依赖:
<dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>sso</artifactId> </dependency>
内容的提问来源于stack exchange,提问作者이상빈
相关产品推荐
相关产品推荐

