是否总是需要在S3 ListObjects / ListObjectsV2响应中检查isTruncated?

时间:2019-05-20 19:41:04

标签: amazon-web-services amazon-s3 aws-sdk

S3的ListObjectsListObjectsV2 API响应都包含一个IsTruncated响应元素,该元素(根据V1 API docs

  

指定是否返回(true)(false)所有结果。如果结果数量超过MaxKeys指定的数量,则可能不会返回所有结果。

根据S3文档的Listing Objects Keys部分:

  

由于存储桶可以包含几乎无限数量的键,因此列表查询的完整结果可能非常大。为了管理大型结果集,Amazon S3 API支持分页以将它们分成多个响应。每个列表键响应都返回一个页面,该页面最多包含1,000个键,并带有指示符,指示响应是否被截断。您发送一系列列表键请求,直到收到所有键。 AWS SDK包装器库提供相同的分页。

很明显,我们需要检查isTruncated是否有可能与列表中的1000个以上的键匹配。同样,如果我们明确设置了MaxKeys,那么我们肯定需要检查isTruncated,是否有可能列表匹配的项超过MaxKeys键。

但是,如果我们从不希望匹配键超过isTruncated个,我们需要检查min(1000, MaxKeys)吗?

我认为S3 API文档的最弱解释是每个清单调用S3最多返回 min(1000, MaxKeys)个键,但从技术上讲,即使更多,键返回的键也更少匹配的键已存在并且适合响应。例如,如果有10个匹配键和MaxKeys == 1000,则从技术上讲,S3在第一个API响应中返回3个键,在第二个API响应中返回7个键在技术上是有效的。 (从技术上讲,我想它甚至可以返回零键并设置isTruncated = true,但这种行为似乎不太可能。)

由于这些弱语义,我认为我们 总是需要检查isTruncated,即使我们列出的是我们期望的很小一部分键。必然地,任何检查isTruncated的代码都是(很可能是)错误的。

过去,我从其他AWS API(包括EC2预留实例市场API)中观察到了此列表语义。

这是对S3 API语义的正确解释吗?还是S3实际上保证(但不提供文档)更强的语义(例如,“如果有多个MaxKeys键与列表匹配,则列表中将确切包含MaxKeys)?

我对引用了AWS官方资源(例如AWS论坛响应,SDK问题等)的答案特别感兴趣。

1 个答案:

答案 0 :(得分:0)

根据我的经验,它将始终返回最大数量的值,这就是您声明的值:min(1000, MaxKeys)

因此,如果您知道总会有不到1000个结果,则无需检查isTruncated

提醒您,构造一个while循环很容易做到。 (可能比写这个问题要容易!)