ListObjects 操作在 AWS 上的限制

ListObjects operation's limit on AWS

我正在查看 AWS 的 go SDK 中 ListObjects 函数的 documentation

actual API 端点也差不多)

因此文档写道:

Returns some or all (up to 1,000) of the objects in a bucket.

这是什么意思?如果我的存储桶有 200.000 个对象,此 API 调用将不起作用?

This 示例使用 ListObjectsPages(在后台调用 ListObjects)并声称列出 所有 个对象。

这里的实际情况是什么?

I am going through the documentation of ListObjects function in AWS' go SDK.

使用 ListObjectsV2。它的行为大致相同,但它是 ListObjects 的更新版本。 AWS 更新 APIs 并不常见,当他们这样做时,通常是有充分理由的。他们在向后兼容性方面做得很好,这就是 ListObjects 仍然存在的原因。

This example uses ListObjectsPages (which calls ListObjects under the hood) and claims to list all objects.

ListObjectsPagesListObjects 的分页等价物,我将在下面描述的 V2 版本也是如此。

许多 AWS API 响应是分页的。 AWS 使用游标分页;这意味着 request responses include a cursor - ContinuationToken in the case of ListObjectsV2 . If more objects exist (IsTruncated in the response), a subsequent ListObjectsV2 request content can provide the ContinuationToken 从第一个响应停止的地方继续列表。

ListObjectsV2Pages 为您处理迭代 ListObjectsV2 请求,因此您不必处理 ContinuationTokenIsTruncated 的逻辑。相反,您提供一个函数,该函数将为响应中的每个“页面”调用。

所以说 ListObjectsV2Pages 将列出“所有”对象是准确的,但这是因为它在后端进行 多个 ListObjectsV2 调用将列出不止一页的回复。

因此,...Pages 函数可以被认为是便利函数。您应该始终在适当的时候使用它们——它们消除了分页的痛苦,而分页对于使潜在的大量 api 响应可操作至关重要。在 AWS 中,如果支持分页,假设您需要它 - 在典型情况下,结果的第一页不保证包含 any 个结果,即使后续页面包含。

The AWS Go SDK V2 gives us paginator types to help us manage S3's per-query item limits. ListObjectsV2Pages is gone. In its place we get ListObjectsV2Paginator,处理@Daniel_Farrell提到的分页细节

构造函数接受与列表对象查询相同的参数 (type ListObjectsV2Input)。分页器公开了 2 个方法:HasMorePages: boolNextPage: (*ListObjectsV2Output, error).

var items []Item

for p.HasMorePages() {
  batch, err := p.NextPage(ctx)
  // etc...
  item = append(items, newItems...)
}