2017-07-07 72 views
1

我们上传了几个zip文件到s3。所有这些都在几百MB的范围内。s3文件下载不可预知

我们通常通过脚本下载文件,看起来文件大小和类型都发生了变化。新的文件大小通常约为300字节,下载的文件类型为xml。

文件的内容类似于以下(空白增加了清晰度):

<?xml version="1.0" encoding="UTF-8"?> 
<Error>  
    <Code>NoSuchKey</Code> 
    <Message>The specified key does not exist.</Message> 
    <Key>gpdb-5.0.0.0/greenplum-db-5.0.0.0-rhel5-x86_64.zip</Key> 
    <RequestId>83D2047BDBA195A6</RequestId>  
    <HostId>tXKFaiRaNjD26j6fcrTjCk858PGBH2RAjLE1aO4+8hovD6mf+hUzJvCdWKKgrDJGaHXsjWbQP2A=</HostId> 
</Error> 

任何想法,以什么可能会导致此?它不会一直发生。这有点间歇。

+0

你是如何下载文件的? –

回答

0

正如你将在S3 API Reference中注意到的那样,这不是一个文件 - 它是一个错误信息。

S3中的文件被称为对象,而对象的路径+文件名被称为对象关键字。

密钥是存储桶中对象的唯一标识符。桶中的每个对象都只有一个键。 [...] Amazon S3中的每个对象都可以通过Web服务端点,存储桶名称,密钥和可选版本的组合来唯一地寻址。例如,在URL http://doc.s3.amazonaws.com/2006-03-01/AmazonS3.wsdl中,“doc”是存储桶的名称,“2006-03-01/AmazonS3.wsdl”是关键。

http://docs.aws.amazon.com/AmazonS3/latest/dev/Introduction.html#BasicsKeys

此错误消息,这应该当您试图访问该对象一直伴随着一个404 Not Found错误代码,表明有在其键(路径+文件名)桶没有对象错误中显示的那个 - 您请求的那个。你应该能够在S3控制台中确认它的缺席。

如果该对象应该在过去一段时间内上传过,则此错误表示该对象未实际上传或随后被删除。

如果对象是非常最近上传的(一般在几秒钟内),你不应该得到这个错误,但有可能在以下两种附加条件发生此错误:

  • 如果您尝试通过向存储桶发送GETHEAD请求来检查对象是否存在,然后上载该对象。如果这样做,由于S3内部的内部优化,可以在对象访问之前经过一段短时间。当你试图获取一个不存在的对象时,S3可能会在短时间内有一个内部的概念,即该对象不存在,即使它已被安全地存储。重试您的请求。
  • 如果你已经有一个对象具有相同的密钥,然后你删除它,然后你上传一个新的对象与相同的密钥,在新的上传后短暂的时间,你可以得到上面的错误,或者你可以实际上再次下载旧对象。

这些条件有点少见,但他们可能会出现,特别是如果你的桶中有大量的流量,由于S3的consistency model,这是上传对象的即时提供高性能,可靠性之间的设计折衷,而当最近下载了相同的对象,试图下载,删除或覆盖。

<RequestId><HostId>错误响应中的代码是您可以提供给AWS支持的不透明诊断代码,如果您需要提交关于您遇到的S3特定问题的支持请求,他们可以使用这些代码找到具体的请求并找出问题。它们不被视为敏感信息,因为它们在AWS之外没有任何意义。

在这种情况下,没有明显需要联系AWS支持,因为您似乎只是试图下载不在您尝试下载此特定文件的特定存储桶中的对象。如果对于完全相同的文件交替成功和失败,这是意想不到的,并且可能会出现支持案例......但通常,S3中的内部错误应该导致非常不同的响应。