メモ書き
主に扱うオブジェクトは3種類
- client(AWSとの接続を行う)
- bucket(親ディレクトリ)
- object(ファイル)
1.client
s3を操作する主体となる
require 'aws-sdk'
AWS.config({
:access_key_id => as.access,
:secret_access_key => as.secret,
})
s3 = AWS::S3.new
2.bucket
バケットを作成
誰かが既に使っているバケット名は使用できない。
s3.buckets.create 'angelbeats'
#=> AWS::S3::Errors::BucketAlreadyExists: The requested bucket name is not available. The bucket namespace is shared by all users of the system. Please select a different name and try again.
s3.buckets.create 'angel-beats'
#=> #<AWS::S3::Bucket:angel-beats>
バケットの存在
あるバケットないしオブジェクトが存在するか?はexists?
誰かが使っており、権限がないバケットに対しては、当たり前だが弾かれる。
s3.buckets['angel-beats'].exists?
#=> true
s3.buckets['angel----beats'].exists?
#=> false
s3.buckets['angelbeats'].exists?
#=> AWS::S3::Errors::AllAccessDisabled: All access to this object has been disabled
3.object
オブジェクトの作成
存在しないobjectをwriteすると、S3サーバにファイルが生成される。
obj = s3.buckets['angel-beats'].objects['test.txt']
#=> <AWS::S3::S3Object:angel-beats/test.txt>
obj.exists?
#=> false
obj.write("天使ちゃん")
#=> <AWS::S3::S3Object:angel-beats/test.txt>
obj.exists?
#=> true
オブジェクトのURLの確認、アクセス権限の操作
存在するobjectには、一意のURLが与えられている。
とはいえ、デフォルトでは「プライベートリンク」になっている。
obj.public_url.to_s
#=> "https://angel-beats.s3.amazonaws.com/test.txt"
# "https://angel-beats.s3.amazonaws.com/test.txt"をブラウザで開くと:
# <Message>Access Denied</Message>
パブリック属性を与えれば、URLで観覧できる。
# write時
obj.write("天使ちゃん", acl: :public_read)
# 後付け
obj.acl = :public_read
# 戻す
obj.acl = :private
オブジェクトの読み出し
なお、パブリック属性をつけなくても、権限を持つclientならread
で読み出せる。
obj.read
#=> "\xE5\xA4\xA9\xE4\xBD\xBF\xE3\x81\xA1\xE3\x82\x83\xE3\x82\x93"
obj.read.encoding
#=> #<Encoding:ASCII-8BIT>
obj.read.force_encoding('utf-8')
#=> "天使ちゃん"
その他
あるバケットの、ファイルやフォルダの一覧を取得
# バケット内のファイル&ディレクトリ一覧
s3.buckets['angel-beats'].objects.map(&:key)
#=> ["test.txt"]
# ファイル(ツリーの葉っぱ)一覧
s3.buckets['angel-beats'].as_tree.children.select(&:leaf?).map(&:key)
#=> ["test.txt"]
# フォルダ(ツリーの枝)一覧
s3.buckets['angel-beats'].as_tree.children.select(&:branch?).map(&:prefix)
#=> []