AWS 上 ListObjects 操作的限制

Posted

技术标签:

【中文标题】AWS 上 ListObjects 操作的限制【英文标题】:ListObjects operation's limit on AWS 【发布时间】:2022-01-19 22:42:26 【问题描述】:

我正在通过 AWS 的 go SDK 中的 documentation 的 ListObjects 函数。

(对于actual API 端点或多或少同样适用)

所以文档写道:

返回存储桶中的部分或全部(最多 1,000 个)对象。

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

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

这里的实际情况是什么?

【问题讨论】:

【参考方案1】:

我正在浏览 AWS 的 go SDK 中 ListObjects 函数的文档。

使用 ListObjectsV2。它的行为或多或少相同,但它是 ListObjects 的更新版本。 AWS 更新 API 并不是很常见,而当他们这样做时,通常是有充分理由的。他们非常擅长向后兼容,这就是 ListObjects 仍然存在的原因。

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

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

许多 AWS API 响应是分页的。 AWS 使用光标分页;这意味着 request responses 包含一个游标 - 在 ListObjectsV2 的情况下为 ContinuationToken。如果存在更多对象(响应中的IsTruncated),则后续的ListObjectsV2 request content can provide the ContinuationToken 将在第一个响应停止的位置继续列出。

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

所以说ListObjectsV2Pages 将列出“所有”对象是准确的,但这是因为它使多个 ListObjectsV2 在后端调用它会列出多于一页的响应。

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

【讨论】:

【参考方案2】:

The AWS Go SDK V2 为我们提供分页器类型来帮助我们管理 S3 的每个查询项目限制。 ListObjectsV2Pages 不见了。取而代之的是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...)

【讨论】:

以上是关于AWS 上 ListObjects 操作的限制的主要内容,如果未能解决你的问题,请参考以下文章

无效操作:操作 s3:ListObjects 不存在

如何将值从 listObjects 推送到数组

如何使用 Java 列出存储桶中的所有 AWS S3 对象

达到限制后自动暂停整个 AWS 账户

将数组插入 listobjects().listcolums().databodyrange

codevs 1191 数轴染色