これはJAWS-UG秋田支部 第3回勉強会の発表で使った物です。
自己紹介
コミュニティ
- Akita.m
- Akita Ruby Meeting
- デジコミュ秋田
言語
- Ruby
- Objective-C
プラットフーム
- iOS
- Ruby On Rails
- Android (2015?)
------
S3とは
------
Amazon S3 はインターネット用のストレージサービスです。ウェブスケールの処理能力を開発者が簡単に利用できるよう設計されています。
Amazon S3 にはシンプルなインターフェイスが用意されており、いつでもウェブのどこからでも容量に関係なくデータを保存/取得できます。これによって、開発者は拡張可能で信頼性が高く、安全で、高速でありながら安価なインフラストラクチャを利用することが可能になります。このシステムは、Amazon が使用しているウェブサイトのグローバルネットワークと同じものです。このサービスの目的は規模のメリットを最大化で開発者に提供することです。
利用例
- ストレージ
- ファイル
- バックアップ
- 画像
- 動画
- その他なんでも
- ファイル
- ファイルシステム
- Dropboxの様なサービスも作れるかもよ
AWSアカウント作成
コンソール
S3コンソール
------
試してみよう
------
バケットを作る
入れ物。フォルダに相当。
- Create Bucketをクリック
- Bucket Nameにjaws-ug-akita-kito-3
- 全regionでユニークな名前
- Region
- US Standard選択(フレームワークのデフォルトになってる)
- デフォルトはOregonになっている
- Createをクリック
はいできた
ファイルを入れる
バケットをクリック
- Upload
- ファイル、フォルダ単位でアップロード
- プロパティで属性確認、編集できます
- Create Folder
- フォルダ作成
- Actions
- その他の操作
- 削除とか
- その他の操作
------
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
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に
フォルダアクションを利用
シェルスクリプトを実行を追加
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 "$@"
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](https://qiita-image-store.s3.amazonaws.com/0/8941/d2f38c6d-8bd0-5965-a21b-3c6de15f6a3d.png "kobito.1401359501.340515.png")
それDropboxにあるじゃん…
比較的簡単におれおれDropbox作れそう
ソース