AmazonS3からダウンロード

download-awss3.rb

#!/usr/bin/env ruby
require 'rubygems'
require 'aws/s3'

if ARGV.size < 1
  puts 'ruby download-awss3.rb bucketname'
  puts 'ruby download-awss3.rb bucketname prefix'
  exit 1
end

AWS::S3::Base.establish_connection!(:access_key_id => "your-access-key-id", 
                                    :secret_access_key => "your-secret-access-key")

bucket_name = ARGV.shift
file_prefix = ARGV.shift if ARGV.size > 0

tmpdir = 'tmpdir'
Dir.mkdir(tmpdir) if !File.exists?(tmpdir)

objs = AWS::S3::Bucket.objects(bucket_name, :prefix => file_prefix)
i = 0
objs.each{|obj|
  print "#{obj.path} (#{i}/#{objs.size})"
  filename = obj.path.split('/').last
  open(out_filename="#{tmpdir}/#{filename}", 'w'){|f|
    f.write obj.value
    puts " => #{out_filename}"
  }
  i+=1
}
ruby download-awss3.rb bucket名 keyのprefix

でまとめてダウンロード。



s3はbucketを作ってその中がKVSになっている。valueとして巨大なファイルを置いておける。
keyは Buckets.objectsでprefix等で検索できる http://amazon.rubyforge.org/doc/classes/AWS/S3/Bucket.html#M000069

AWS::S3::Bucket.objects(bucket_name, :prefix => file_prefix)

AWS::S3::S3Objectの配列が返ってくる。


たとえばbucket内にディレクトhogeを作ってその中にたくさんファイルがあったら、keyのprefixにhoge/を指定すればhoge/をprefixに持つS3Objectインスタンスが全て手に入る



keyが正確にわかっている場合はS3Object.findで直接取ればいい http://amazon.rubyforge.org/doc/classes/AWS/S3/S3Object.html#M000038
establish_connectしてから

open("tmpdir/result.png", 'w'){|f|
   f.write AWS::S3::S3Object.find("key", "bucket名").value
}

でファイルに保存。