Ruby 的 AWS 开发工具包是否在存储桶枚举期间下载 S3 对象?

Does the AWS SDK for Ruby download S3 objects during bucket enumeration?

当使用 Amazon Ruby SDK for S3 时,我需要枚举一个巨大的存储桶中的所有文件以识别任何空文件,即 obj.content_length == 0

我写了一个脚本来做到这一点:

bucket.objects.each() do |obj|
  total_objs += 1

  if obj.content_length == 0 then
    empty_files += 1
    puts obj.key
  end
end

...但我担心这会导致下载每个文件以确定文件大小。 SDK 是否实际下载文件以了解大小,或者它只是被拉取的元数据,然后如果调用适当的方法则延迟下载对象?

此外,是否有更有效的方法来实现我想要做的事情?

获得所需内容的最简单方法是使用 v2 AWS SDK for Ruby,可用形式为 aws-sdk-core:

require 'aws-sdk-core'

empty_files = 0    

s3 = Aws::S3::Client.new
s3.list_objects(bucket:'aws-sdk').each do |resp|
  resp.contents.each do |obj|
    if obj.content_length == 0
      empty_files += 1
      puts obj.key
    end
  end
end

上面的代码每 1k 个对象准确地发出 1 个请求(仅 S3 returns 每个响应的 1k 个对象的信息)。它使用 SDK 内置的客户端响应分页功能来确保您一直调用 #list_objects 直到用完存储桶。这不会下载对象主体,您可以调用 Aws::S3::Client#get_object 来执行此操作。

更新:

v2 SDK 现在通过面向资源的接口支持这一点。上面相同的代码示例使用 aws-sdk-resources:

require 'aws-sdk' # must be v2 sdk

empty_files = 0

s3 = Aws::S3::Resource.new
s3.bucket('aws-sdk').objects.each do |obj|
  if obj.size == 0
    empty_files += 1
    puts obj.key
  end
end