AWS SDK for Ruby(v2) で簡単なS3操作
仕事でAWS SDK for Ruby (v2) をちょっとだけ使ったのでメモ。 AmazonS3の操作を行った。
環境
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::Credentials.new
でインスタンスを作成してAws.config[:credentials]
にセットするというやり方でも良さそう。
とにかくGitHubとかにキーをPushするなと。
S3上での各種操作
今回はpryから触った。
Railsプロジェクトでsdkをbundle 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.できるみたいだし、 プログラムからほぼ全操作可能なのだろう。自動化には欠かせないし、今さらながら便利である...