【问题标题】:how many objects are returned by aws s3api list-objects?aws s3api list-objects 返回了多少对象?
【发布时间】:2019-07-29 05:09:14
【问题描述】:

我正在使用:

aws s3api list-objects --endpoint-url https://my.end.point/ --bucket my.bucket.name --query 'Contents[].Key' --output text

获取存储桶中的文件列表。

aws s3api list-objectdocumentation page 表示此命令最多返回 1000 个对象,但是我注意到在我的情况下它返回我存储桶中所有文件的名称。例如,当我运行以下命令时:

aws s3api list-objects --endpoint-url https://my.end.point/ --bucket my.bucket.name --query 'Contents[].Key' --output text | tr "\t" "\n" | wc -l

我得到 13512 显示,这意味着返回了超过 13000 个文件名。

我是不是错过了什么?

我使用以下 aws cli 版本:

aws-cli/1.10.57 Python/2.7.3 Linux/3.2.0-4-amd64 botocore/1.4.47

【问题讨论】:

  • 使用--query时如何限制结果?
  • 我使用head解决了我的问题:aws s3api list-objects --bucket $bucket_change_class --query 'Contents[?StorageClass==STANDARD].[Key]' --output text | head -n 2

标签: linux amazon-web-services amazon-s3


【解决方案1】:

返回存储桶中的部分或全部(最多 1000 个)对象。您可以使用请求参数作为选择标准来返回存储桶中的对象子集。 [1]

我认为文档描述中的“(最多 1000 个)”部分高度误导。它指的是 cli 发送的每个底层 HTTP 请求的最大页面大小。 --page-size 选项的文档说明了这一点:

要在 AWS 服务调用中获取的每个页面的大小。这不会影响命令输出中返回的项目数。设置更小的页面大小会导致对 AWS 服务的调用更多,每次调用中检索的项目更少。这有助于防止 AWS 服务调用超时。

阅读有关分页的 AWS 文档 [2] 时,它会变得更加清晰:

对于可以返回大量项目列表的命令,AWS 命令​​行界面 (AWS CLI) 添加了三个选项,当 AWS CLI 调用服务的 API 进行填充时,您可以使用这些选项来控制输出中包含的项目数量列表。

默认情况下,AWS CLI 使用 1000 的页面大小并检索所有可用项目。例如,如果您在包含 3,500 个对象的 Amazon S3 存储桶上运行 aws s3api list-objects,则 CLI 对 Amazon S3 进行四次调用,在后台为您处理特定于服务的分页逻辑,并在最后返回所有 3,500 个对象输出。

正如 Ankit 已经正确指出的那样,使用 --max-items 选项是限制结果并停止自动分页的正确解决方案:

要在 AWS CLI 输出中一次包含更少的项目,请使用 --max-items 选项。如上所述,AWS CLI 仍使用服务处理分页,但一次仅打印出您指定的项目数。 [2]

参考文献

[1]https://docs.aws.amazon.com/cli/latest/reference/s3api/list-objects.html
[2]https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-pagination.html

【讨论】:

  • 我认为这个分页有一个错误。当我执行aws s3api list-objects --bucket $bucket --query 'Contents[?StorageClass==STANDARD].{Key: Key, Size: Size, StorageClass: StorageClass}' --output text --max-items 1 时,我得到None 结果。如果我不包括 --max-items 我会得到很多结果。使用--max-items,我期待一个键而不是None
  • 我认为查询部分是在获取项目后应用的(不是服务器端)。因此,您的单个请求项目可能会被过滤掉。您可以使用不带过滤器的 JMESPath 表达式来验证这一点。
  • 为了更清楚我的想法:以下命令返回什么? aws s3api list-objects --bucket $bucket --query 'Contents[0].{Key: Key, Size: Size, StorageClass: StorageClass}' --output text --max-items 1
【解决方案2】:

尝试在命令中使用--max-items

doc 提到,当项目数超过 max-items 时,它将返回 NextMarker。您可以在下次调用时将其传递为starting-token 以实现分页。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    • 2020-06-06
    • 2012-05-13
    • 2010-12-27
    • 1970-01-01
    相关资源
    最近更新 更多