Amazon S3异常:“指定的密钥不存在”


79

我在Android应用程序中使用AmazonS3Client,使用getObject请求从我的Amazon S3存储桶下载图像。

目前,我收到此异常:

com.amazonaws.services.s3.model.AmazonS3Exception: 
The specified key does not exist.
 (Service: Amazon S3; Status Code: 404; Error Code: NoSuchKey;

即使我能够在S3存储桶中看到具有指定键的对象。


1
我认为当对象/文件在指定存储桶中不存在时,通常会发生此错误。您能否再次检查用于错字的存储桶的名称,以及是否与查看对象/文件的存储桶相同?这肯定不是身份验证错误。
Shobhit Puri

23
亚马逊文档很烂,这个问题不能被否决。弄清楚S3编程非常疯狂。
Siddharth

目前,在任何文件夹下都找不到Index.html。AWS文档中并未提到AWS S3存储桶权限。

1
我喜欢有十二种不同的答案,它们都是正确的。
Rob Osborne

Answers:


47

好吧,这个错误实际上很简单。这仅表示您的文件不在S3存储桶中。有几件事情可能是错误的:

  1. 您可能正在尝试引用错误的文件。仔细检查您尝试检索的路径。

  2. 无论何时上传文件,它都一定会失败。检查S3Sync进程的日志,以查看是否可以找到任何相关的输出

资源


3
链接过期使答案无用了一段时间,您应该从该链接中提取信息并更新此答案以使其完整。随时分享您的资源..没关系..
Siddharth 2015年

谢谢,这有助于保持SO的清洁和有用。
Siddharth'3

1
我在处理自己的路由的React应用程序中遇到了这个问题。我的解决方案最终是同时重定向root和重定向errors到同一index.html文件。这样,前端应用程序就可以发挥全部作用,并可以理解任何URL方案。
sambecker

26

对我来说,该对象肯定存在并且已正确上传,但是,它的s3 url仍然引发相同的错误:

<Code>NoSuchKey</Code>
<Message>The specified key does not exist.</Message>

我发现原因是因为我的文件名包含一个#符号,并且我猜某些字符或符号也会导致此错误。

删除此字符并生成新的s3 url解决了我的问题。


同样的问题在这里。令人反感的角色是方括号:(
Johann

我面临同样的问题,我的文件名是“ abcd.jar”。下载功能扩展是否也特定?
Rahul Munjal '16

@RahulMunjal我不太确定文件扩展名,也许尝试将其放在.zip文件夹中?看看是否可行。另外,再次检查文件权限是否正确(例如,“所有用户”组的“只读”访问权限)。
TrieuNomad

同样,我必须在键上使用encodeURIComponent才能使s3找到它。文件名已经被编码,我认为这是无法正常工作的原因。
肖恩

我遇到过同样的问题。我在S3的子文件夹/前缀中有'@'符号。删除该符号将删除该错误。
Anil Konsal

11

请注意,由于s3的最终一致性模型,即使文件路径正确也可能会发生这种情况。基本上,在写入对象之后,读取对象可能会有些延迟。有关更多信息,请参见此文档


这也是我的问题。现在,我在短时间内实现了自动重试。
moritz.vieli,

2

就我而言,出现错误是因为我已将包含网站文件的整个文件夹上载到了容器中。

我通过将所有文件移出文件夹,直接移入容器来解决了该问题。


2

就我而言,这是因为文件名包含空格。通过以下文档解决了该问题(与问题无关):

from urllib.parse import unquote_plus
key_name = unquote_plus(event['Records'][0]['s3']['object']['key'])

您还需要上传urllib作为具有相应版本的图层(如果lambda是Python 3.7,则必须在python 3.7环境中打包urllib)。

原因是AWS将''转换为'+'(为什么...),这确实是有问题的...


0

问题的原因是“存储桶/密钥”名称有误或错字。请检查您提供的存储桶或密钥名称是否存在。


0

不要忘记,存储桶是特定于区域的。那可能是个问题。

另外,尝试使用S3控制台导航到实际对象,然后单击Copy Path,您将获得类似以下内容的信息:

s3://<bucket-name>/<path>/object.txt

只要将它传递给正确解析的文件,我都会发现这是最安全的事情。


0

步骤1:获取最新 aws-java-sdk

<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-aws -->
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.11.660</version>
</dependency>

步骤2:正确导入

import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.ListObjectsRequest;
import com.amazonaws.services.s3.model.ObjectListing;

如果确定存储桶存在,则Specified key does not exists error表示存储桶名称拼写错误(包含斜杠或特殊字符)。请参考文档中的命名约定。

该文件引用:

如果请求的对象在存储桶中可用,并且用户仍从Amazon S3收到404 NoSuchKey错误,请检查以下内容:

确认请求与对象名称完全匹配,包括对象名称的大小写。对S3对象的请求区分大小写。例如,如果一个对象名为myimage.jpg,但请求了Myimage.jpg,则请求者将收到404 NoSuchKey错误。确认请求的路径与对象的路径匹配。例如,如果对象的路径是awsexamplebucket / Downloads / February / Images / image.jpg,但请求的路径是awsexamplebucket / Downloads / February / image.jpg,则请求者将收到404 NoSuchKey错误。如果对象的路径包含任何空格,请确保请求使用正确的语法来识别路径。例如,如果您使用AWS CLI将对象下载到Windows计算机,则必须在对象路径周围使用引号,类似于:aws s3 cp“ s3:// awsexamplebucket /备份复制作业4 / 3T000000.vbk”。(可选)您可以启用服务器访问日志记录,以更详细地查看请求记录,以查找可能导致404错误的问题。

AWSCredentials credentials = new BasicAWSCredentials(AWS_ACCESS_KEY_ID, AWS_SECRET_KEY);
AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withRegion(Regions.US_EAST_1).build();
ObjectListing objects = s3Client.listObjects("bigdataanalytics");
System.out.println(objects.getObjectSummaries());

0

我也遇到了这个问题,但就我而言,在构造目标键时,我无意中更改了源对象键的内部状态:

  source_objects.each do |item|
    key = item.key.sub!(source_prefix, dest_prefix)
    item.copy_to(bucket: dest_bucket, key: key)
  end

我是Ruby的新手,但是没有sub!副作用,sub应该改用它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.