AWS S3 SDK请求报错:需使用指定端点访问桶问题排查
问题原因分析
你的Java代码中S3客户端指定的区域是EU_CENTRAL_1(法兰克福),但从日志可以看到,目标存储桶myxwaveq实际位于eu-west-1(爱尔兰)区域(日志中连接的端点是myxwaveq.s3.eu-west-1.amazonaws.com)。S3要求请求必须发送到存储桶所在区域的端点,区域不匹配时会返回301重定向错误。AWS CLI会自动处理这种重定向,所以能正常执行,但Java SDK默认不会自动跟进重定向,因此报错。
解决方法
方法1:修正客户端区域配置(推荐)
直接将S3客户端的区域改为存储桶实际所在的EU_WEST_1,这是最直接且高效的方式:
private String putS3Object(String objectKey, String mimeType, byte[] content) { // 修正区域为eu-west-1 S3Client s3 = S3Client.builder() .region(Region.EU_WEST_1) .build(); log.info("adding {} - {} - to {} ", objectKey, mimeType, bucketName); try { PutObjectResponse response = s3.putObject(PutObjectRequest.builder() .bucket(bucketName) .contentType(mimeType) .key(objectKey) .acl(ObjectCannedACL.PUBLIC_READ) .build(), RequestBody.fromBytes(content)); return response.eTag(); } catch (S3Exception e) { log.error(e.getMessage()); } return ""; }
方法2:启用客户端自动重定向(备选)
如果因某些原因无法修改区域,可以配置S3客户端允许自动跟进重定向:
private String putS3Object(String objectKey, String mimeType, byte[] content) { S3Client s3 = S3Client.builder() .region(Region.EU_CENTRAL_1) // 启用自动重定向 .serviceConfiguration(config -> config.dualstackEnabled(true).enableRedirects()) .build(); // 后续代码保持不变 log.info("adding {} - {} - to {} ", objectKey, mimeType, bucketName); try { PutObjectResponse response = s3.putObject(PutObjectRequest.builder() .bucket(bucketName) .contentType(mimeType) .key(objectKey) .acl(ObjectCannedACL.PUBLIC_READ) .build(), RequestBody.fromBytes(content)); return response.eTag(); } catch (S3Exception e) { log.error(e.getMessage()); } return ""; }
注意:这种方式会增加一次重定向请求,影响性能,因此优先推荐方法1。
内容的提问来源于stack exchange,提问作者Nunyet Calçada
相关产品推荐
相关产品推荐

