S3的ListObjects
和ListObjectsV2
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问题等)的答案特别感兴趣。
答案 0 :(得分:0)
根据我的经验,它将始终返回最大数量的值,这就是您声明的值:min(1000, MaxKeys)
因此,如果您知道总会有不到1000个结果,则无需检查isTruncated
。
提醒您,构造一个while
循环很容易做到。 (可能比写这个问题要容易!)