2011年8月18日木曜日

s3fs : Amazon linux への導入

最近いじってるAWSのお話。

今回とりあげるのは、s3fs。
何かというと、AWSのストレージサービスであるS3のバケットをマウントして、ファイルシステムと同様に使うためのライブラリです。

もう結構前からあるのでご存知の方も少なくないかと思いますが、、、

それを導入した際に少し手間取ったので、手順をメモとして残しておきます。

まず環境は、下記の通り。

OS:Basic 32-bit Amazon Linux AMI AWSがAMIとして提供している例のあれです。

s3fs : s3fs-1.40  2011/08/17現在、1.59が最新ですがDevelopment版なので、念のためStableの方を使います。

以下、つらつらと。

◆ s3fs 導入前準備

 まずは必要なパッケージをインストール。wikiに書いている通り、足りないパッケージをインストールします。

# yum install gcc
# yum install libstdc++-devel
# yum install gcc-c++
# yum install curl-devel
# yum install libxml2.-devel
# yum install openssl-devel
# yum install mailcap
# yum install make

 ◎注意:
 fuse に関しては、yumでインストールせず、ソースからコンパイルする。
 デフォルト状態では、リポジトリのfuseのバージョンが、2.8.4 までしかなく、要件を満たせない。
 ということで、ソースダウンロード~コンパイル。

# wget http://sourceforge.net/projects/fuse/files/fuse-2.X/2.8.5/fuse-2.8.5.tar.gz/download
# ls -l
# tar zxvf fuse-2.8.5.tar.gz
# cd fuse-2.8.5
# pwd
# ls -l
# ./configure prefix=/usr
# make
# make install

 ここらへんを設定しておかないと、s3fs を configure する際に、fuse のバージョンとかを
 確認出来ないため、エラーになる。
# export PKG_CONFIG_PATH=/usr/lib/pkgconfig/:/usr/lib64/pkgconfig/
# echo $PKG_CONFIG_PATH

 共有ライブラリを探索するパスを再設定
# ldconfig

 動作中のカーネルにモジュールをインストールする。
 詳しくは聞かないでください。。
# modprobe fuse

 これが、普通に通れば問題ない。
# pkg-config --modversion fuse
2.8.5

 と、いうことで、必要なパッケージがそろったので、ここからs3fs自体のインストールを行う。

◆s3fs インストール

 s3fs ソースゲット。ネットから普通に落とします。
# wget http://s3fs.googlecode.com/files/s3fs-1.40.tar.gz
# sha1sum s3fs-1.40.tar.gz
# tar zxvf s3fs-1.40.tar.gz
# cd s3fs-1.40
# ./configure prefix=/usr
# make
# make install

 接続アカウント情報を記載したファイルを作成する。
# echo アクセスキー:シークレットキー > /etc/passwd-s3fs
# chmod 640 /etc/passwd-s3fs

ここまでで、s3fs のインストールは終了。
ここから実際にs3をマウントしてみる。

◆S3をマウント

# mkdir /mnt/s3
# s3js bucket-for-s3fs /mnt/s3 -o allow_other ※オプションを考慮する。権限関係とか。manで確認。

ん、何も出ないってことはうまくいったかな。
df で確認してみると、、、

# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/xvda1 7.9G 1.7G 6.2G 21% /
tmpfs 299M 40K 299M 1% /dev/shm
s3fs 256T 0 256T 0% /mnt/s3

なんと256T!これは使い放題だ~w
ファイルを作っても、ディレクトリを作っても、色々入ってるディレクトリを丸ごと移動しても、まったりはしてますがきちんと動作します。
そして、S3の方を確認してみると、、、おぉ~ちゃんと出来てる。

レスポンスの体感速度としては、

ls -l を普通に打って、返ってくるまで1秒弱くらい。
やっぱり結構もっさりって感じ。環境にもよるかもしれませんが。
中身がどうなってるのか見てませんが、リクエストが飛んでると想像すると、これくらいなんですかね。

まぁでもそれにつけても、ファイルシステムと同様に使用できる、という利便性が勝つかなぁと個人的には思います。
※ただし、クリティカルなシステムにすぐに使用できるか、という話になると、そんなに色んなパターンを試したわけではないので要検証、ご利用は自己責任で、という感じです、、、。

アンマウントしたい時は、普通に、

# umount /mnt/s3

でオーケー。

また、起動時にマウントするには、

/etc/fstab に、

s3fs#s3fs-test /mnt/s3/ fuse allow_other

を追記しておけば大丈夫です。
fstabの書き方は、cloudpackさんのblog記事を参考にさせて頂きました。ありがとうございます。


最後にひとつ注意。

マウントしている S3 のバケットにs3fsを通さずに直接フォルダを作成すると、s3fs(を用いてs3をマウントしているOS)からは見えません。
なので、s3fs経由で使用したいフォルダ(ディレクトリ)を作成する際には、OS側からディレクトリを作成する必要があります。

と、いうのも、s3fs でマウントしたディレクトリ以下で、ディレクトリの作成を行うと、当然ファイルシステム的にはディレクトリのみが出来るわけですが、AWSのS3を管理コンソールから見てみると、

作成したディレクトリ(S3的にはフォルダ)
作成したディレクトリと同じ名前の 0byte ファイル

が作成されています。
どうもこの 0byte ファイルが無いとs3fs的には認識出来ないようです。
かといって、管理コンソールでフォルダを作って、その後に同名の 0byte ファイルを配置しても、やっぱりOSからは見えませんでした。
おそらくMetadataで何か登録しているのだとは思いますが、そこまでは解析してません。。

ひとまずは、ディレクトリを作る時はOS側から作ろうか、という話でした。


とりあえず、s3fs の導入は以上~。


おしまい。

0 件のコメント:

コメントを投稿