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の記述

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

以上、現場からでした。

2011年7月13日水曜日

S3ってなんじゃ?(AWSコンソール編)

AWSのS3(Simple Storage Service)というストレージサービスがあります。
このサービスは、冗長性が高く、さまざまなファイルアクセスを提供しており、WEBサービス向けのストレージとして人気です。
ツールも各種クライアントがあり運用や管理も簡単です。

今回はAWSのコンソールを利用してS3のサービスに触れてみます。
https://console.aws.amazon.com/s3/
にアクセスし、ログインします。(AWSのアカウントを取得していることが前提です)

 初めて使用する場合は以下のような画面になっています。



 左ペインの上部に「Create Bucket」というボタンがあります。
これを押すと以下のようにBucket(バケット) を作成するダイアログが表示されます。
Bucketとはストレージ領域の単位のことで、ディスクパーティションのようなものです。
Bucket名と使用するリージョンを選択します。
ここでは以下のようにしました
  • Bucket Name : myfirst-bucket
  • Region : Tokyo

また、Bucket名はS3に登録されている全てのBucket内でユニークである必要があります。
「Set up Logging」というボタンがあります、これはこのバケット内のファイルへのWEBからのスタティックアクセスのログを行うための設定ですが、ここでは割愛します。



 すると、以下のように左ペインにBucketができます。
なんのファイルもアップロードしていないので、右ペインは空っぽです。



 ここで右ペイン上部の「Create Folder」ボタンをクリックして、フォルダーを作成します。
するとフォルダがひとつ作成されます。ここではhogeというフォルダを作成しました。



 hogeフォルダをダブルクリックしてhogeフォルダの中を表示します。


ここで右ペイン上部の「Upload」ボタンをクリックすると以下のようなファイルアップロードのダイアログが表示されます。



 「Add Files」をクリックするとファイル選択のダイアログが表示されるので、そこでアップするファイルを選びます。ここではmizu.jpgというファイルを選択しました。
ちなみに「Use Reduce Redundancy Strorage」というチェックを入れると、通常のS3ストレージではなくRRSという廉価版のストレージに格納されます。S3よりも冗長性は弱くなりますが(それでも99.99%)、利用料金はS3のおよそ2/3ほどに抑えられます。



ここで、右下の「Set Permissions」ボタンをクリックすると、次の画面のように、このファイルのパーミッションを指定できます。ここでは2つのチェックボックスがあります。
  • Grant me full control:いまログインしているAWSユーザーにS3コンソール上でのファイルの列挙、ファイルの閲覧、操作を許可(チェックをはずしてもなぜかフルコントロール可能です。)
  • Make everything public:このファイルをWEBで公開します。

デフォルトは「Grant me full control」だけにチェックがついています。
これらのチェックを変更したり、パーミッションを追加することもできますが、
今回はこのまま先に進み、「Set Metadata」ボタンをクリックします。



ここではこのファイルに対するMetadataヘッダの追加を行うことができます。
デフォルトで「Figure out content types automatically」にチェックがついており、
ファイルのタイプに応じて自動的にContent-Typeヘッダを付与するようになっています。



他にも追加したい場合は「Add more metadata」ボタンをクリックし、以下のように追加していきます。



最後に「Start Upload」ボタンを押してアップロードをします。
すると以下のようにファイルが追加されたのがわかります。



設定を行わずにファイルを選択したらすぐに「Start Upload」ボタンを押してアップロードをしてもかまいません。ファイルをアップしたあとでもファイルの設定を行うことも可能です。

アップしたファイルは以下のURLでアクセスが可能です。
http://バケット名.s3.amazonaws.com/バケット内のファイルパス

今回は
  • バケット名:myfirst-bucket
  • ファイルパス:/hoge/mizu.jpg
なので、
http://myfirst-bucket.s3.amazonaws.com/hoge/mizu.jpg
でアクセスします。

すると以下のエラーXMLがレスポンスとして返されました。
<error>
  <code>AccessDenied</code>
  <message>Access Denied</message>
  <requestid>60E98F3FB80D83C1</requestid>
  <hostid>+XIP+XDq0t3HxjErdLH8jz9JTc8oN0puRZH6ABZTiakQ/o/incRd4st2LNH9p4Vq</hostid>
</error>

これは、先ほどのパーミッションの設定で「Make everything public」にチェックをつけず、デフォルトのままアップロードしたためです。
これをあとから変更し、WEBアクセスができるようにします。
再びコンソールにもどり、先ほどのファイル一覧でmizu.jpgを右クリックし、コンテキストメニューから「Properties」を選びます。
すると下ペインにこのファイルのプロパティが表示されます。



「Permissions」タブで「Add more permissions」ボタンを押し、追加された行の「Grantee」で「Everyone」を選び、「Open/Download」にチェックを入れます。
右下の「Save」ボタンをクリックすると、WEBアクセスが許可されます。
また、もっと簡単な方法として、ファイルやフォルダを右クリックして「Make public」を選ぶだけでファイルやフォルダ内の全てのファイルが上記パーミッション設定を行ったのと同じ結果になり、WEBに公開されます。もちろん、先ほどのアップロード時に「Make everything public」にチェックを入れても同じ結果になります。

再度
http://myfirst-bucket.s3.amazonaws.com/hoge/mizu.jpg
にアクセスすると今度は画像が正しく表示されました。




今回はここまでにします。