aws-sdkを使ってAmazon S3を操作する

ちょっと間が開いたけど、インストールした aws-sdk を使ってみた。

created-bucket

まずはバケットを作る。aws-sdk を使ってもできるけど、ブラウザからやった。これがバケットを作ったところ。見難い(てか見えない)けど panicblanet ていうバケットができている。

次に、API にアクセスするための Access Key ID と Secret Access Key を取得する。これは右上の自分の名前が書いてあるところをクリックすると現れるプルダウンメニューから Security Credentials を選ぶと、キーを作れるページに移動するのでそこで作る。詳しくは書かないけど難しくはない。

さて、これで準備が整った。それじゃ最初はファイルをアップロードするスクリプトから行こう。

require 'aws'
require 'yaml'

config = YAML.load_file("aws-config.yaml")

file = ARGV.shift
key = ARGV.shift
content = File.open(file, "rb"){|f| f.read}

s3 = AWS::S3.new(
  :access_key_id     => config["ACCESS_KEY_ID"],
  :secret_access_key => config["SECRET_ACCESS_KEY"])

bucket = s3.buckets["panicblanket"]
obj = bucket.objects[key]
if obj.exists?
  puts "Error: Object already exists: #{key}."
  exit
end
obj.write(content, :acl => :public_read)

キーをハードコードするのはアレなので aws-config.yaml ファイルから読み込むようにした。早速試してみよう。

^o^ > ruby s3_upload_file.rb Penguins.jpg Penguins.jpg
uploaded_object

何も出力されないのはうまくいったからのはずだ。ブラウザで確認してみると、ちゃんとアップロードされているのがわかる。

penguins

アクセスコントロールに :public_read を指定しているので、誰でもブラウザで見られるはずだ。URL は http://panicblanket.s3.amazonaws.com/Penguins.png。

うん、うまくいってる。

バケットの中のオブジェクトを指定するキーはディレクトリ風にもできる。こんなふうに。

^o^ > ruby s3_upload_file.rb Penguins.jpg data/Penguins.jpg

それじゃ次はバケットに保存されているオブジェクトのリストを取得してみる。

require 'aws'
require 'yaml'

config = YAML.load_file("aws-config.yaml")

s3 = AWS::S3.new(
  :access_key_id     => config["ACCESS_KEY_ID"],
  :secret_access_key => config["SECRET_ACCESS_KEY"])

bucket = s3.buckets["panicblanket"]
bucket.objects.each do |obj|
  puts obj.key
end
^o^ > ruby s3_list_objects.rb
Penguins.jpg
data/Penguins.jpg

上でアップロードした2つのオブジェクトが表示された。

つぎ、ダウンロード。

require 'aws'
require 'fileutils'
require 'yaml'

config = YAML.load_file("aws-config.yaml")

key = ARGV.shift

s3 = AWS::S3.new(
  :access_key_id => config["ACCESS_KEY_ID"],
  :secret_access_key => config["SECRET_ACCESS_KEY"])

file = key
if File.dirname(file) != "."
  FileUtils.mkdir_p(File.dirname(file))
end

bucket = s3.buckets["panicblanket"]
obj = bucket.objects[key]

unless obj.exists?
  puts "Error: No such object: #{key}"
  exit
end

File.open(file, "wb") do |f|
  obj.read do |chunk|
    f.write(chunk)
  end
end
^o^ > ruby s3_download_object.rb data/Penguins.jpg

^o^ > ls data
Penguins.jpg

これもうまくいってる。よしよし。

それじゃ最後に、オブジェクトの消去。

require 'aws'
require 'yaml'

config = YAML.load_file("aws-config.yaml")

s3 = AWS::S3.new(
  :access_key_id     => config["ACCESS_KEY_ID"],
  :secret_access_key => config["SECRET_ACCESS_KEY"])
bucket = s3.buckets["panicblanket"]

key = ARGV.shift
obj = bucket.objects[key]
unless obj.exists?
  puts "No such object: #{key}"
  exit
end
obj.delete
^o^ > ruby s3_delete_object.rb data/Penguins.jpg

^o^ > ruby s3_list_objects.rb
Penguins.jpg

ちゃんと消えたようだ。