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

时间:2015-02-22 00:51:59

标签: android amazon-web-services amazon-s3

我在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存储桶中看到具有指定键的对象。

12 个答案:

答案 0 :(得分:23)

这个错误实际上是相当直接的。它只是意味着您的文件在S3存储桶中不存在。有些事情可能是错的:

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

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

  3. Source

答案 1 :(得分:17)

对我来说,该对象肯定存在且被正确上传,但是,它的s3网址仍然存在同样的错误:

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

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

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

答案 2 :(得分:2)

在我的情况下出现错误是因为我已将包含网站文件的整个文件夹上传到容器中。

我通过将文件夹外的所有文件移动到容器中来解决它。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

在我的情况下,这是因为文件名包含空格。由于documentation(与问题无关)而解决了该问题:

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将''转换为'+'(为什么...),这确实是有问题的...

答案 5 :(得分:1)

我在 NodeJS Lambda 函数中遇到此问题,该函数由文件上传到 S3 触发。

我的错误是我没有解码包含冒号的对象键。更正我的代码如下:

let key = decodeURIComponent(event.Records[0].s3.object.key);

答案 6 :(得分:0)

问题的原因是Bucket / Key名称错误或拼写错误。检查您提供的存储桶或密钥名称是否存在。

答案 7 :(得分:0)

别忘了存储桶是特定于区域的。那可能是个问题。

也尝试使用S3控制台导航到实际对象,然后单击Copy Path,您将得到类似的内容:

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

只要您将其正确解析,我都会发现这是最安全的事情。

答案 8 :(得分: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表示存储桶名称的拼写错误(包含斜杠或特殊字符)不正确。请参考documentation了解命名约定。

文档引用:

  

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

     

确认请求与对象名称完全匹配,包括   对象名称的大写。对S3对象的请求是   区分大小写。例如,如果一个对象名为myimage.jpg,但是   请求Myimage.jpg,然后请求者收到404 NoSuchKey   错误。确认请求的路径与对象的路径匹配。   例如,如果对象的路径是   awsexamplebucket /下载/ 2月/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());

答案 9 :(得分: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来代替。

答案 10 :(得分:0)

就我而言,我的密钥名称错误。确保您拥有正确的密钥名称。 enter image description here

答案 11 :(得分:0)

如果您的文件位于存储分区内的子文件夹中,则该子文件夹应该是密钥的一部分,而不是存储分区的一部分。使用以下命令,我能够在 PowerShell 中读取该文件。

示例:

Get-S3Object -BucketName "$Bucket" -Key "$subFolder/$fileName"