如何解决 Amazon S3 的 404“NoSuchKey”错误?

上次更新时间:2019 年 12 月 17 日

我的用户尝试访问我的 Amazon Simple Storage Service (Amazon S3) 存储桶中的对象,但 Amazon S3 返回 404“NoSuchKey”错误。我应该如何解决此错误? 

解决方案

如果存储桶中请求的对象缺失,则 Amazon S3 通常会返回 404 错误。在用户针对某个对象发出 GET 或 HEAD 请求之前,请确保已在存储桶中创建该对象且该对象可用。您可以从 Amazon S3 控制台查看存储桶中的内容,以检查存储桶中的某个对象是否可用。或者,您可以使用 AWS 命令行界面 (AWS CLI) 运行 head-object 命令: 

aws s3api head-object --bucket awsexamplebucket --key object.jpg

此外,如果对象是最近上传的,Amazon S3 也可能会返回“NoSuchKey”错误。当您上传对象时,Amazon S3 会在多台服务器之间复制数据,因此只有在跨多台服务器完全复制对象之后,才能找到新上传的对象。如果在对象上传之前调用了 GET 或 HEAD 对象,Amazon S3 会提供写后读取的最终一致性。为避免新上传的对象出现“NoSuchKey”错误,请在 PUT 请求之后等待几秒钟,然后再进行该对象的首次访问尝试。

如果用户所请求的对象是存储桶中已存在一段时间的可用对象,但还是收到 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/Backup Copy Job 4/3T000000.vbk"
  • 检查对象名称中是否存在任何特殊字符或 URL 编码字符,这些字符可能很难看到,例如回车 (\r) 或换行 (\n)。例如,在末尾带有回车符的对象名称 test 在 Amazon S3 控制台中显示为 test%0A。要检查对象名称的特殊字符,您可以运行带有参数 --output jsonlist-objects-v2 命令。JSON 输出使诸如回车 (\r) 之类的字符可见。如果对象名称具有不总是可见的特殊字符,请从对象名称中删除该字符,然后尝试再次访问该对象。
  • (可选)您可以启用服务器访问日志记录,以查看请求记录中可能会导致 404 错误的问题的详细信息。

注意:如果存储桶中的对象缺失并且请求者没有 s3: ListBucket 访问权限,则请求者会收到 403“访问被拒绝”错误,而不是 404 错误。在这种情况下,您必须解决与对象缺失相关的问题以解决 403“访问被拒绝”错误。


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?