2011年7月29日金曜日

S3ってなんじゃ?(RUBY SDK鈍行編1 ruby on railsの準備)

今回はS3をruby sdkで使うためにもう少し細かく見ていきます。
はじめに、rubyruby on rails のインストールをEC2にインストールしてみます。

rubyをインストール
まず動作に必要な各種ライブラリをパッケージインストーラでインストールし、rubyは最新をソースからインストールします。
# yum install git gettext-devel gcc rpm-build zlib-devel gcc-c++ openssl openssl-devel httpd-devel libxml-devel←まちがいでしたごめんなさい。正しくは→ libxml2-devel libxslt-devel
....
# cd /usr/local/src 
# wget ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.2-p290.tar.gz
# tar xzvf ruby-1.9.2-p290.tar.gz 
# cd ruby-1.9.2-p290
# ./configure
# make
# make install

次にrailsを動かすためのいくつかのツールをインストールします。

ruby opensslをインストール
# cd /usr/local/src/ruby-1.9.2-p290/ext/openssl
# ruby extconf.rb
# make
# make install

passengerとpasserngerのapacheモジュールをインストール
# gem install passenger
# passenger-install-apache2-module

そしてrailsのインストール
gem install rails

インストールはこれで終了です。

次にrailsのプロジェクトを作ります。
$ cd /var/www/html
$ rails new -J -T myfirstcloud

作成したらpassengerモジュールをロードし、ドキュメントルートをプロジェクトディレクトリにするようにApacheの設定をします。
# vi /etc/httpd/conf/httpd.conf
....
LoadModule passenger_module /usr/local/lib/ruby/gems/1.9.1/gems/passenger-3.0.7/ext/apache2/mod_passenger.so 
PassengerRoot /usr/local/lib/ruby/gems/1.9.1/gems/passenger-3.0.7
PassengerRuby /usr/local/bin/ruby 
....
<VirtualHost *:80>
   ServerAdmin webmaster@dummy-host.example.com
   ServerName ec2-175-41-210-229.ap-northeast-1.compute.amazonaws.com
   ErrorLog logs/ec2-175-41-210-229.ap-northeast-1.compute.amazonaws.com-error_log
   CustomLog logs/ec2-175-41-210-229.ap-northeast-1.compute.amazonaws.com-access_log common
   DocumentRoot /var/www/html/myfirstcloud/public
   RackEnv development
   <Directory /var/www/html/myfirstcloud/public >
       AllowOverride all
       Options -MultiView
   </Directory>
</VirtualHost>
これで設定は完了です。
ブラウザでアクセスしてみます。



RAILSの最初の画面が表示されました。
今日はここまで。続きはWEBで。

2011年7月27日水曜日

S3ってなんじゃ?(RUBY SDK特急編)

こんどは最近公開されたAWS SDK for Rubyをつかってみます。
rubyがインストールされている前提です。

まずgemでsdkをインストールします。
# gem install aws-sdk

次にSDKをgitから落としてサンプルディレクトリを見ます。
$ git clone git://github.com/amazonwebservices/aws-sdk-for-ruby.git
$ cd aws-sdk-for-ruby/samples/

アクセスキーの設定をするためにサンプルディレクトリ内に「config.yml」を作ります。
$ echo "access_key_id: アクセスキー" > config.yml
$ echo "secret_access_key: シークレットキー" >> config.yml

そして、S3にアップするためのテストファイルを用意します。
$ echo "Welcome Ruby" > welcome.txt

アップロードします。
$ ruby s3/upload_file.rb hoge-bucket welcome.txt

するとS3にファイルアップロードされ、AWSコンソール上でもアップを確認できました。
 

今日は特急編ということで、ここまで、次回もうちょっと詳しく説明したりしなかったり。


追記:2011/07/29
もし、
ERROR:  Error installing aws-sdk:
        ERROR: Failed to build gem native extension.

/usr/local/bin/ruby extconf.rb
checking for libxml/parser.h... yes
checking for libxslt/xslt.h... no
....
と出る場合は、yumなどでlibxml2-develとlibxslt-develをインストールしてください。

2011年7月20日水曜日

S3ってなんじゃ?(s3cmd編)

今回はS3にコマンドラインからアクセスするCLIツールs3cmdを使用してみます。

ここから最新のs3cmdをダウンロードします。

$ wget http://downloads.sourceforge.net/project/s3tools/s3cmd/1.0.1/s3cmd-1.0.1.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fs3tools%2Ffiles%2Fs3cmd%2F1.0.1%2F&ts=1311152465&use_mirror=jaist -o s3cmd-1.0.1.tar.gz

展開してインストールします。
$ tar -xzvf s3cmd-1.0.1.tar.gz
$ cd s3cmd-1.0.1
# python setup.py install

接続の設定を行います。
$ s3cmd --configure

Enter new values or accept defaults in brackets with Enter.
Refer to user manual for detailed description of all options.

Access key and Secret key are your identifiers for Amazon S3
Access Key: アクセスキーを入力
Secret Key: シークレットキーを入力

Encryption password is used to protect your files from reading
by unauthorized persons while in transfer to S3
Encryption password: 転送時の暗号化のパスワードを入力(ここではなにもいれずにEnter)
Path to GPG program: GPG暗号化プログラムへのパスを入力(ここではなにもいれずにEnter)

When using secure HTTPS protocol all communication with Amazon S3
servers is protected from 3rd party eavesdropping. This method is
slower than plain HTTP and can't be used if you're behind a proxy
Use HTTPS protocol [No]:   転送にHTTPSを使用する場合はYes(ここではなにもいれずにEnter)

On some networks all internet access must go through a HTTP proxy.
Try setting it here if you can't conect to S3 directly
HTTP Proxy server name: プロキシサーバーを利用する場合はサーバー名(ここではなにもいれずにEnter)

New settings:
Access Key: xxxxxxxxxxxxxxxxxxx
Secret Key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Encryption password: 
Path to GPG program: None
Use HTTPS protocol: False
HTTP Proxy server name: 
HTTP Proxy server port: 0

Test access with supplied credentials? [Y/n] 接続テストを行う場合はY
Please wait...
Success. Your access key and secret key worked fine :-) ←接続成功

Now verifying that encryption works...
Not configured. Never mind.

Save settings? [y/N] 設定を保存するにはy
Configuration saved to '/home/memorycraft/.s3cfg'


バケットの内容を確認します。
$ s3cmd ls s3://mount-test/
2011-07-18 17:08  22209951   s3://mount-test/Stardust.m4v

バケットにファイルを転送します。
$ echo hello > hello.txt
$ s3cmd put -P hello.txt s3://mount-test/hello.txt
hello.txt -> s3://mount-test/hello.txt  [1 of 1]
6 of 6   100% in    0s    21.11 B/s  done
Public URL of the object is: http://mount-test.s3.amazonaws.com/hello.txt

このようにとても簡単に使用できます。
またコマンドラインなので、アプリケーションやバッチなどにすぐに利用できて大変便利です。

2011年7月19日火曜日

S3ってなんじゃ?(BitTorrent編)

今回はS3のおもしろい機能を使ってみます。
S3はデフォルトとしてHTTPプロトコルでファイルのサーブを行っていますが、BitTorrentプロトコルもサポートしています。

通常、BitTorrentはトレントファイル(*.torrentという拡張子で、トラッカーサーバーの情報だけを保持しているごく軽量のファイル)をトレントファイル配布サイト(インデックスサイト)からダウンロードし、そのファイルを元にBitTorrentクライアントソフトを使用して本体ファイルを持っているピア(シーダー)とP2P接続を行います。

ここでは、S3をBitTorrentのインデックスサイト兼シーダーとして利用してみます。

まず、S3のコンソール画面で「Upload」ボタンをクリックして、配布したい本体ファイルをS3にアップロードします。


アップロードしたファイルで右クリックのメニューから「Properties」を選び、「Permission」タブで「Everyone」の「Open/Download」を有効にし、ファイルを一般に公開します。

ここまでは、通常のS3の公開と同様の手順です。
以上でサーバー側の準備は完了です。
実は、これだけでBitTorrentの設定等は特に必要ありません。

それでは、クライアント側でダウンロードしてみます。
今回はMacのTransmissionを利用してみます。


右クリックメニューから「Open Torrent Address ...」を選択し、アドレスを入力します。
ここにはトレントファイルのURLを入力するのですが、S3のURLの後ろに?torrentを追加したものを入力するだけです。


例えば、S3のURLが
http://s3-ap-northeast-1.amazonaws.com/mount-test/Stardust.m4v
の場合
http://s3-ap-northeast-1.amazonaws.com/mount-test/Stardust.m4v?torrent
とするだけでS3からトレントファイルを取得できます。
実際にブラウザで上記URLにアクセスすると
ファイル名.torrent
というトレントファイルがダウンロードできるはずです。
トレントファイルのURLを直接入力できないクライアントソフトは、ブラウザでトレントファイルをダウンロードしてから、torrentクライアントソフトでそのファイルを開いて利用してください。

すると、構成ファイルも正常に表示され、ダウンロードを開始すると
下記のように正常にダウンロードが行われていることがわかります。
 ダウンロードしたファイル(今回はm4vファイル)も正常に再生できました。
このように、S3には最初のシーダーとなるだけではなく、自動的にトレントファイルを生成してくれるので、S3側ではなにもしなくてもBitTorrentのインデックスサイトになることができます。

一次ファイルの配布としてはHTTPダウンロードと大差はないかと思いますが、S3からBitTorrent形式で配布する利点はいくつかあります。
例えば最終的に不特定多数のユーザーにファイルを配布したいが、通信速度はそこまででなくてもよい場合や、S3の帯域や利用料金を節約したい場合などです。

しばらくの間S3でファイルをpublic-readで公開して、?torrentでトレントファイルを予めダウンロードしたものをホストサーバーにおき、それをトレントファイルとして公開しておきます。S3の高速な帯域でスムーズに一次配布をしておき、十分にスウォーム(同じトレントファイルでファイル共有ができたクライアントのグループ)が成長した段階でS3の公開を閉じることで、それ以降はS3の帯域を全く使わずにクライアント間のP2Pアクセスだけでファイルの配布を行うことができます。

コンテンツやサイトの内容によっては選択肢として考慮するだけの価値があるかもしれません。

今日はここまで。

2011年7月15日金曜日

S3ってなんじゃ?(s3fs編)

s3fsというS3の領域をファイルシステムとしてマウントできる仕組みがあります。
今回はそれを使ってみます。

インストール

s3fsはFUSEというファイルシステムを構築するためのフレームワークをベースとして作られているため、動作にはFUSEのインストールが必要です。

最初にインストールやベースとなる挙動に必要なものをyumからインストールします。
# yum -y install gcc
# yum -y install gcc-c++
# yum -y install libstdc++-devel
# yum -y install pkgconfig
# yum -y install make
# yum -y install curl-devel
# yum -y install libxml2-devel

次にFUSEのインストールです。FUSEはyumからも取得できますが、リポジトリにはs3fsが対応しているfuseのバージョンよりも古いものしかないためここからソースを取得してインストールします。
$ wget http://downloads.sourceforge.net/project/fuse/fuse-2.X/2.8.5/fuse-2.8.5.tar.gz?r=&ts=1310717181&use_mirror=jaist -O fuse-2.8.5.tar.gz
$ tar xvzf fuse-2.8.5.tar.gz
$ cd fuse-2.8.5/
$ ./configure prefix=/usr
$ make
# make install 

次にpkgconfigパスを環境変数に設定します。
PKG_CONFIG_PATH=/usr/lib/pkgconfig:/usr/lib64/pkgconfig/
#configureにprefixをつけなかった場合は/usr/local/lib/pkgconfigです。

fuseをモジュールとしてカーネルにロードします。
# ldconfig
# modprobe fuse

続いてs3fsをインストールします。
ここからs3fsをダウンロードしてインストールします。
$ wget http://s3fs.googlecode.com/files/s3fs-1.40.tar.gz
$ cd s3fs-1.40
$ ./configure prefix=/usr
$ make
# make install
これでインストールは完了です。



設定

マウントするs3のアカウント情報をs3fsに教えるために、/etc/passwd-s3fsにキー情報を記載します。
# echo アクセスキー:シークレットキー > /etc/passwd-s3fs
# chmod 640 /etc/passwd-s3fs 
複数の認証を設定する場合は
# echo バケット名:アクセスキー:シークレットキー > /etc/passwd-s3fs
# chmod 640 /etc/passwd-s3fs 
とします。

それではマウントしてみます。
# mkdir /mnt/s3
# s3fs myfirst-bucket /mnt/s3

これでmyfirst-bucketというバケットが/mnt/s3というディレクトリとしてマウントすることができました。
# df -k
Filesystem           1K-ブロック    使用   使用可 使用% マウント位置
/dev/sda1             10321208   3364700   6432220  35% /
none                    314952         0    314952   0% /dev/shm
fuse                 274877906944         0 274877906944   0% /mnt/s3





おまけ

ついでに起動時の自動マウントの設定を行います。

/etc/fstabの最終行に以下の設定を追記し、自動でボリュームをマウントするようにします。
# vi /etc/fstab
......

s3fs#myfirst-bucket /mnt/s3 fuse allow_other,default_acl=public-read 0 0


しかしこれだけでは、fuseが有効になっていないため、自動マウントに失敗します。
fstabの設定が実行される前にfuseを有効にするため、
rc.sysinit内のfstabの記述より前にfuseをカーネルにロードして有効にします。
# vi /etc/rc.d/rc.sysinit
.....

. /etc/init.d/functions
modprobe fuse ←----------------追記

....
fstabの記述

これで、起動時に自動的にマウントされるようになります。

以上、現場からでした。