Edited at

RubyからS3を使ってみる

これはJAWS-UG秋田支部 第3回勉強会の発表で使った物です。


自己紹介


コミュニティ


  • Akita.m

  • Akita Ruby Meeting

  • デジコミュ秋田


言語


  • Ruby

  • Objective-C


プラットフーム


  • iOS

  • Ruby On Rails

  • Android (2015?)


------


S3とは


------

Amazon S3


Amazon S3 はインターネット用のストレージサービスです。ウェブスケールの処理能力を開発者が簡単に利用できるよう設計されています。

Amazon S3 にはシンプルなインターフェイスが用意されており、いつでもウェブのどこからでも容量に関係なくデータを保存/取得できます。これによって、開発者は拡張可能で信頼性が高く、安全で、高速でありながら安価なインフラストラクチャを利用することが可能になります。このシステムは、Amazon が使用しているウェブサイトのグローバルネットワークと同じものです。このサービスの目的は規模のメリットを最大化で開発者に提供することです。



利用例


  • ストレージ


    • ファイル


      • バックアップ



    • 画像

    • 動画

    • その他なんでも



  • ファイルシステム

  • Dropboxの様なサービスも作れるかもよ


AWSアカウント作成

無料アカウント作成の流れ

Sign up

Sign up


コンソール

AWSマネジメントコンソール

kobito.1400159750.023471.png

kobito.1400159955.381855.png


S3コンソール

kobito.1400763856.092491.png


------


試してみよう


------


バケットを作る

入れ物。フォルダに相当。


  • Create Bucketをクリック

  • Bucket Nameにjaws-ug-akita-kito-3


    • 全regionでユニークな名前



  • Region


    • US Standard選択(フレームワークのデフォルトになってる)

    • デフォルトはOregonになっている



  • Createをクリック

kobito.1400764277.103059.png

はいできた

kobito.1400764377.284324.png


ファイルを入れる

バケットをクリック

kobito.1400765277.014070.png


  • Upload


    • ファイル、フォルダ単位でアップロード



kobito.1400765451.858923.png

- プロパティで属性確認、編集できます

kobito.1400766308.099015.png


  • Create Folder


    • フォルダ作成



kobito.1400766362.318499.png


  • Actions


    • その他の操作


      • 削除とか





kobito.1400766423.360301.png


------


Rubyから使う


------


aws-sdk-ruby

Amazon official library

AWS SDK for Ruby

aws/aws-sdk-ruby (github)

api documentation


インストール

$ gem install aws-sdk


Bundler便利だよ

Gemfile作成

$ bundle init

使用するgemを記述。

Rubyのバージョンを記述するとrvmなどがフォルダ移動時に切替えてくれる。

# A sample Gemfile

source "https://rubygems.org"

gem "aws-sdk"

ruby "2.0.0"

Gemの準備

$ bundle install

bundle だけでもOK。

$ bundle


aws-sdk使ってみる

require 'aws-sdk'

AWS.config(
:access_key_id => 'YOUR_ACCESS_KEY_ID',
:secret_access_key => 'YOUR_SECRET_ACCESS_KEY')


YOUR_ACCESS_KEY_ID & YOUR_SECRET_ACCESS_KEY

kobito.1400163761.627451.png

secret access keyの扱いが変わった

kobito.1400767526.266092.png

kobito.1400767575.150540.png


S3を扱うには

s3 = AWS::S3.new

Region指定する場合は

s3 = AWS::S3.new "ap-northeast-1"  # Asia Pacific (Tokyo) Region

デフォルトはus-east-1 (US Standard)


バケット取得

AWS::S3#buckets

AWS::S3::BucketCollection

s3.buckets['jaws-ug-akita']

全てのバケット

each で回せる

s3.buckets.each do |b|

puts b.name
end

s3.buckets.collect(& :name)


バケット作成

s3.buckets.create "my-bucket"

Optionで権限など指定できる


Options Hash (options):

:location_constraint (String) — default: nil — The location where the bucket should be created. Defaults to the classic US region; however, if you configure a regional endpoint for Amazon S3 this option will default to the appropriate location constraint for the endpoint. For example:

s3 = AWS::S3.new(:region => "us-west-1")

bucket = s3.buckets.create("my-us-west-bucket")

bucket.location_constraint # => "us-west-1"

:acl (Symbol, String) — default: :private — Sets the ACL of the bucket you are creating. Valid Values include: * :private * :public_read * :public_read_write * :authenticated_read * :log_delivery_write

:grant_read (String)

:grant_write (String)

:grant_read_acp (String)

:grant_write_acp (String)

:grant_full_control (String)



バケット操作

AWS::S3#Bucket


削除

bucket = s3.buckets.create "my-bucket"

bucket.delete # 中身が無い状態で

bucket.delete! # 中身を空にしてから削除

bucket.clear!

bucket.delete


ファイル操作

AWS::S3::BucketCollection

AWS::S3::Object


ファイルの生成/書込み

AWS::S3::Object#write

o = bucket.objects["helloworld.txt"]

o.write("Hello World!")


ファイルの読み込み

AWS::S3::Object#read

o = bucket.objects["helloworld.txt"]

o.read # => "Hello World!"


ファイルアップロード(local -> S3)

# "jaws-akita-1.jpg"という画像ファイルがある

o = o.bucket.objects["jaws-akita-1.jpg"]
o.write(file: "jaws-akita-1.jpg")


ファイルダウンロード(S3 -> local)

File.open("download.jpg", "w") do |f|

o.read do |chunk|
f.write chunk
end
end


バケット削除(内包する全てのファイルも削除)

  bucket.delete!


サーバーサイドでの暗号化

  o = bucket.objects["enc-helloworld.txt"]

o.write("Hello World!", :server_side_encryption => :aes256)
o


暗号化ファイルの読込み

普通に読込みでOK

  puts o.read


フォルダ作成

path指定するだけ。簡単。

  o = bucket.objects["folder/こんにちは.txt"]

o.write("こんにちは")


バージョニング

バージョン管理もできる。

バージョニング有効にする。

  bucket.enable_versioning

ファイルを色々更新

  o = bucket.objects['versioning.txt']

o.write "a"
o.write "b"
o.delete
o.write "c"

前バージョンのブラウズ

  o.versions.each do |obj_version|

unless obj_version.delete_marker?
puts obj_version.read
else
puts "- DELETE MARKER"
end
end

最新バージョン

  o.versions.latest


ライフサイクル

1年経過で削除

  bucket.lifecycle_configuration.update do

add_rule('', :expiration_time => 365)
end


Glacier


きわめて低コストのストレージサービスである Amazon Glacier は、ストレージのセキュリティと耐久性を特徴としており、データのアーカイブやバックアップに適しています。コストを低く抑えるために、Amazon Glacier は、アクセス頻度の低いデータや、取り出しに数時間かかっても問題ないデータに合わせて最適化されています。Amazon Glacier ならば、データの量にかかわらず、1 か月あたり 0.01 USD/GB という低額で安心してデータを保管できるので、オンプレミスのソリューションに比べて大幅にコストを削減できます。


バックアップなどの使用頻度が低いデータは一定期間経過後にGlacierに転送。

1ヶ月後に転送

  bucket.lifecycle_configuration.update do

add_rule('backups/', :glacier_transition_time => 30)
end


新機能

古いバージョンを定期的にGlacierに移して、更に時間が経ったら削除などもできる様になったらしい。

APIからのやり方はドキュメント見ただけでは分りませんでした。(まだ準備中?)

Amazon S3 でバージョン管理されたオブジェクトもLifecycle管理が可能に


スクリーンショットを自動的にS3に

フォルダアクションを利用

kobito.1401110092.994632.png

シェルスクリプトを実行を追加

kobito.1401723079.326273.png

Ruby環境整えてbackup_screenshots.rbを実行

cd /Users/ISD/Documents/community/aws-akita/3

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"
rvm 2.0.0
ruby backup_screenshots.rb "$@"


backup_screenshots.rb

require 'aws-sdk'

require 'yaml'

config = YAML.load(File.read("aws.config"))

# Configuration
AWS.config(
:access_key_id => config["ACCESS_KEY_ID"],
:secret_access_key => config["SECRET_ACCESS_KEY"])

@s3 = AWS::S3.new

def bucket_for_screenshots
bucket = @s3.buckets["jaws-ug-akita-kito-3-screenshots"]
unless bucket.exists?
bucket = @s3.buckets.create "jaws-ug-akita-kito-3-screenshots"
end
bucket
end

def transmit path
bucket = bucket_for_screenshots
name = File.basename path
o = bucket.objects[name]
o.write(file: path)
end

ARGV.each do |path|
transmit path.dup.force_encoding("utf-8")
end


やったーできた!



























































































kobito.1401359501.340515.png

それDropboxにあるじゃん…


比較的簡単におれおれDropbox作れそう


ソース

https://github.com/katsuyoshi/jaws-ug-akita/tree/master/3


おしまい