调用Amazon S3 getObject接口抛出The specified key does not exist错误如何解决
Amazon S3 NoSuchKeyException 404 问题解决方案
该异常本质是S3服务端判定你指定的桶内不存在请求的Key对应的对象,可按以下步骤排查解决:
问题代码片段:
GetObjectRequest getObjectRequest = GetObjectRequest.builder().bucket(bucketName).key(objectName).build(); ResponseInputStream responese = this.s3Client.getObject(getObjectRequest);
- 首先匹配业务逻辑:你描述的需求是上传对象到S3,但上述代码是S3对象下载的接口调用。如果是要执行上传操作,请替换为
PutObject相关逻辑,示例:
// 上传本地文件示例 PutObjectRequest putObjectRequest = PutObjectRequest.builder() .bucket(bucketName) .key(objectName) .build(); s3Client.putObject(putObjectRequest, Paths.get("你本地要上传的文件路径")); // 上传流示例 PutObjectRequest putObjectRequest = PutObjectRequest.builder() .bucket(bucketName) .key(objectName) .build(); s3Client.putObject(putObjectRequest, RequestBody.fromInputStream(你的输入流, 流长度));
- 如果确实是要执行下载操作,按以下步骤排查:
- 校验
bucketName是否正确,且S3客户端配置的区域和桶实际所属区域完全一致,跨区域访问可能触发404错误 - 校验
objectName(即S3对象Key):S3的Key是大小写敏感的,且完全匹配前后缀,检查是否有多余的斜杠、空格、未转义的特殊字符,不要携带本地文件系统的相对路径前缀(比如./、../等) - 检查账号权限:当前S3客户端使用的凭证必须有
s3:GetObject权限,部分场景下S3为了避免泄露桶内对象存在性,会对无权限的请求返回404而非403 - 如果桶开启了版本控制,检查目标对象是否被添加了删除标记,带删除标记的对象调用普通
getObject会返回404,需要指定对应版本号才能访问 - 如果是刚上传完对象就立刻调用下载接口,S3存在最终一致性延迟,可增加1~2秒的延迟重试逻辑
- 校验
内容的提问来源于stack exchange,提问作者parita porwal
相关产品推荐
相关产品推荐

