blue_field

技術的なメモとか読書記録とかいろいろ(の予定

AWS SDK for Ruby(v2) で簡単なS3操作

仕事でAWS SDK for Ruby (v2) をちょっとだけ使ったのでメモ。 AmazonS3の操作を行った。

aws/aws-sdk-ruby

環境

Credentialsの設定

~/.aws/credentialsに、IAMのユーザーのアクセスキーID・シークレットアクセスキーを書いておくと、 そちらから自動的に読み込まれる。

[default]
aws_access_key_id = <AWS_ACCESS_KEY_ID>
aws_secret_access_key = <AWS_SECRET_ACCESS_KEY>

他にもいくつか方法はあって、GitHubのREADME見るとこう書いてある

Default credentials are searched for in the following locations:

  • Aws.config[:credentials]
  • ENV['AWS_ACCESS_KEY_ID'] and ENV['AWS_SECRET_ACCESS_KEY']
  • The shared credentials ini file at ~/.aws/credentials (more information)
  • From an instance profile when running on EC2

環境変数から直接読み込んでもくれるし、 Aws::Credentials.newインスタンスを作成してAws.config[:credentials]にセットするというやり方でも良さそう。 とにかくGitHubとかにキーをPushするなと。

S3上での各種操作

今回はpryから触った。 Railsプロジェクトでsdkbundle installして利用するときは、最初のrequire要らないはず。

S3のリージョンをセットし、S3用クライアントのインスタンスを生成。

require "aws-sdk-core"
Aws.config[:region] = 'ap-northeast-1'
s3 = Aws::S3::Client.new

s3.methods実行すると、メソッドがいっぱいある...

バケットの一覧表示

resp = s3.list_buckets
resp.buckets
#=> [#<struct  name="aono-test", creation_date=2015-02-15 09:25:20 UTC>]

resp.buckets.map(&:name)
#=> ["aono-test"]

バケットの作成・削除

s3.create_bucket(bucket: 'fugafuga')
#=> #<struct  location="http://fugafuga.s3.amazonaws.com/">

s3.delete_bucket(bucket: 'fugafuga')
#=> #<struct>

オブジェクトの一覧表示

例えばバケットの直下に3枚の画像が入っているとする。

resp = s3.list_objects(bucket: 'aono-test')
resp.contents.map(&:key)
#=> ["foo.jpg", "bar.jpg", "hoge.jpg"]

フォルダーがあって、その下のやつだけ見たいときは、list_objectsメソッドにprefixオプションを指定する。

s3.list_objects(bucket: 'aono-test',  prefix: "folder")

こうすると、folderディレクトリとその直下のファイルだけが一覧される。

また、max_keysオプションで一度に取得するオブジェクトの数を制限できる。 (デフォルトは1,000に設定されている模様)

レスポンスがページングに対応しているので、 それと組み合わせて適度な数だけ取得してくるのがベターな使い方、だろうか。

resp = s3.list_objects(bucket: 'aono-test',  max_keys: 2)

resp.last_page?  #=> false
resp.next_page?  #=> true

next_resp = resp.next_page

アップロード

file = File.open('/path/to/file')
file_name = File.basename('/path/to/file')

s3.put_object(
  bucket: "aono-test",
  body: file,
  key: file_name
)

ダウンロード

File.open("/path/to/file", "w") do |file|
  s3.get_object(bucket: 'aono-test', key: "foo.jpg") do |chunk|
    file.write chunk
  end
end

これで、バケットに置いてあるfoo.jpgをDLして、所定の場所に保存する。

おわり

メモおわり。

上記で挙げた基本的な操作以外にも、バケットポリシーやライフサイクルの更新や削除etc.できるみたいだし、 プログラムからほぼ全操作可能なのだろう。自動化には欠かせないし、今さらながら便利である...