升级S3 Java依赖后向Ceph Bucket上传文件出现403 S3Exception
解决升级AWS S3 SDK v2后Ceph Bucket上传403的问题
核心原因
AWS SDK v2与v1在请求构造、默认配置上存在差异,结合Ceph S3的特性,触发403的常见原因包括:
- 默认启用虚拟主机样式访问,但Ceph集群未配置Bucket对应的DNS解析
- 请求签名或编码逻辑与Ceph兼容不匹配
- Spring Boot 3.x对AWS SDK v2的自动配置参数发生变更
解决方案
1. 强制启用路径样式访问
Ceph S3大多依赖路径样式访问(http://<endpoint>/<bucket>),而AWS SDK v2默认使用虚拟主机样式(http://<bucket>.<endpoint>),需显式开启路径样式:
代码配置方式
import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.S3Configuration; public S3Client s3Client() { S3Configuration s3Config = S3Configuration.builder() .pathStyleAccessEnabled(true) // 关键配置:启用路径样式 .build(); return S3Client.builder() .serviceConfiguration(s3Config) .endpointOverride(URI.create("你的Ceph端点地址")) .credentialsProvider(你的凭证提供者) .build(); }
Spring Boot自动配置方式
在application.yml中添加:
spring: cloud: aws: s3: path-style-access: true region: static: us-east-1 # Ceph通用默认区域,可根据集群配置调整 endpoint: 你的Ceph端点地址
2. 锁定签名算法版本
确保SDK使用Ceph支持的SignatureV4签名算法,可显式指定:
import software.amazon.awssdk.auth.signer.Aws4Signer; import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration; ClientOverrideConfiguration overrideConfig = ClientOverrideConfiguration.builder() .signer(Aws4Signer.create()) .build(); return S3Client.builder() .overrideConfiguration(overrideConfig) // 其他配置项 .build();
3. 调整请求编码逻辑
AWS SDK v2默认的双重编码、分块编码可能与部分Ceph集群不兼容,可尝试禁用:
S3Configuration s3Config = S3Configuration.builder() .disableChunkedEncoding(true) .build();
4. 核对Spring Boot配置参数
Spring Boot 3.x对AWS SDK v2的自动配置参数前缀有变化,需确保配置项正确:
- 原v1的
aws.s3.endpoint对应v2的spring.cloud.aws.s3.endpoint(使用spring-cloud-aws-starter时) - 验证access key、secret key配置无误,可通过
@Value注入后打印确认
验证步骤
- 保留
listBuckets()测试确认基础连接正常(你已能获取Bucket名称,此步骤可快速验证客户端配置有效性) - 启用路径样式后,尝试上传小文件测试
- 查看Ceph集群日志,确认403的具体触发原因(如签名不匹配、路径格式错误)
内容的提问来源于stack exchange,提问作者Shubham Singh
相关产品推荐
相关产品推荐

