LoginSignup
11
11

More than 5 years have passed since last update.

S3の操作

Last updated at Posted at 2015-02-01

メモ書き

主に扱うオブジェクトは3種類

  1. client(AWSとの接続を行う)
  2. bucket(親ディレクトリ)
  3. 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)
#=> []

参考

ローカル環境のRubyとAmazon S3でデータをやり取りする - 未踏作業日誌――余計なもの作るよ!

11
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
11