AWS SDK for Ruby是否在存储桶枚举期间下载S3对象?

时间:2015-01-12 13:33:46

标签: ruby amazon-web-services amazon-s3 aws-sdk

使用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是否实际下载文件以了解大小,或者它是否只是被拉取的元数据,然后如果调用适当的方法则会懒惰地下载对象?

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

1 个答案:

答案 0 :(得分:2)

获得所需内容的最简单方法是使用适用于Ruby的v2 AWS SDK,以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仅返回每个响应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