【问题标题】:Amazon S3 exception: "The specified key does not exist"Amazon S3 异常:“指定的键不存在”
【发布时间】:2022-01-15 00:07:54
【问题描述】:

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

【问题讨论】:

  • 我认为这个错误通常发生在指定存储桶中不存在对象/文件时。您能否仔细检查您使用的存储桶的名称是否存在拼写错误,以及它是否与您看到对象/文件的存储桶相同?这肯定不是身份验证错误。
  • 亚马逊文档很烂,这个问题不能被否决。搞清楚 S3 编程真是太疯狂了。
  • 此时,在任何文件夹下都找不到 Index.html。 AWS S3 存储桶权限并不像 AWS 文档所说的那样。
  • 我喜欢有十几个不同的答案,而且它们都是正确的。

标签: amazon-web-services amazon-s3


【解决方案1】:

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

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

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

Source

【讨论】:

  • 链接过期使答案在一段时间后无用,您应该从该链接中提取信息并更新此答案以使其完整。随时分享您的来源..没关系..
  • 谢谢,这有助于保持清洁和有用。
  • 我在处理自己的路由的 React 应用程序中遇到了这个问题。我的解决方案最终是将rooterrors 重定向到同一个index.html 文件。这样,前端应用程序就可以充当包罗万象的角色,并理解任何 URL 方案。
【解决方案2】:

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

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

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

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

【讨论】:

  • 这里有同样的问题。有问题的字符是一个括号:(
  • 我面临同样的问题,我的文件名为“abcd.jar”。下载功能扩展也是特定的吗?
  • @RahulMunjal 我不太确定文件扩展名,也许尝试将其放在 .zip 文件夹中?看看这是否有效。此外,请仔细检查您的文件的权限是否正确(例如,所有用户组的“只读”访问权限)。
  • 以类似的方式,我必须在密钥上使用 encodeURIComponent 才能让 s3 找到它。文件名已经编码,我认为这是它不起作用的原因。
  • 我遇到了同样的问题。我在 S3 上有子文件夹/前缀的“@”符号。删除该符号会删除该错误。
【解决方案3】:

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

【讨论】:

  • 也是我的问题。现在我在短时间内实现了自动重试。
  • 在提出这个问题时,iirc、S3 为所有 AWS 区域中的新对象的 PUT 提供了强读写一致性(除非您在创建之前对键名发出 HEAD 或 GET 请求物体)。截至 2020 年 12 月,S3 为所有 AWS 区域中的所有对象(不仅仅是新对象)的 PUT(和 DELETE)提供了强写后读一致性。
【解决方案4】:

在我的情况下,这是因为文件名包含空格。感谢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】:

    我在一个由文件上传到 S3 触发的 NodeJS Lambda 函数中遇到了这个问题。

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

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

    【讨论】:

    • 在尝试上传名为me&amp;you.png的图像时也遇到了这个问题
    【解决方案6】:

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

    还可以尝试使用 S3 控制台导航到实际对象,然后单击 Copy Path,您会得到类似:

    s3://&lt;bucket-name&gt;/&lt;path&gt;/object.txt

    只要您将其传递给正确解析,我发现这是最安全的做法。

    【讨论】:

    • 感谢这对我有帮助,因为我的文件位于子文件夹中。使用powershell访问时,子文件夹需要是key的一部分。示例:Get-S3Object -BucketName "$Bucket" -Key "$subFolder/$fileName"
    【解决方案7】:

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

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

    【讨论】:

      【解决方案8】:

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

      【讨论】:

        【解决方案9】:

        第 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/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());
        

        【讨论】:

          【解决方案10】:

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

            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 代替。

          【讨论】:

            【解决方案11】:

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

            例子:

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

            【讨论】:

              【解决方案12】:

              我遇到了同样的问题,我试图从 S3 读取的文件不存在。我会检查您要查找的文件路径是否正确以及文件是否存在。

              【讨论】:

                【解决方案13】:

                我只是提供了错误:

                404 Not Found
                Code: NoSuchKey
                Message: The specified key does not exist.
                Key: index.html
                RequestId: 3C8J01Y73CKKJSCQ
                HostId: QiQ6bqe3Cff/XjDDGm10IAArp9j6kajGKFIv4/JiJBfOFjLLxsiE796TuoLviPsCQl3KOma+Ma0=
                

                这背后的原因是我选择了访问点index.html,但是,我没有拖动文件进行上传,而是选择了整个文件夹。

                所以,index.html 文件确实在configuring-s3-code/index.html 位置,而不是直接在根文件夹中。

                所以,请仔细检查代码库的访问点,问题可能就在那里。

                【讨论】:

                  【解决方案14】:

                  在我的情况下,它就像使用错误的斜杠一样简单(错误:Microsoft 风格,如“foo\bar.txt”。正确:Unix 风格,如“foo/bar.txt”) 如果您在 Windows 上使用 Path.Combine 等辅助函数,则很容易发生...

                  【讨论】:

                    【解决方案15】:

                    我在某些国家/地区遇到此错误,但不是全部(通过使用我的 VPN 选择不同国家/地区进行测试)。

                    解决此问题的方法是在 CloudFront 中创建“自定义错误响应”。

                    我将404 错误代码重定向到/index.html,响应代码为200

                    然后我创建了一个失效,一切又开始工作了。

                    【讨论】:

                      【解决方案16】:

                      就我而言,我的键名错误。确保您拥有正确的密钥名称。

                      【讨论】:

                        猜你喜欢
                        • 2020-01-29
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2011-04-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多