LoginSignup
136
119

More than 3 years have passed since last update.

RubyからS3を使ってみる

Last updated at Posted at 2014-06-02

これは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作れそう

ソース

おしまい

136
119
2

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
136
119