こんにちは。SREチーム インフラエンジニアの綿引です。

本日は goofys という AWS S3 マウント用ソリューションの
インストールについて記載しようと思います。

goofysとは

goofys とはサーバから S3 バケットをファイルシステムのようにマウントして、
OS上からディレクトリの様に使用できるソリューションです。

スクリーンショット-2017-11-15-19.52.53

S3 の使用方法としては、
1. 静的ウェブサイトホスティング機能を有効にして S3 側でホスティングを行う
2. ログなどを格納する (aws cli などを用いて)
といったものが一般的だと思います。

ただ今回の goofys を用いると OS側からマウントができるので、
Linux の「cp」 コマンドや 「ls」 コマンドが使用可能となり、使い方の幅が広がります。

同様の機能を持つソリューションの一つに s3fs というものもあり、
私も今までこちらを使っていたのですがいかんせん遅い。。

最後に goofys と s3fs での簡単な速度検証も行ったので、
是非参考にして頂けたらと思います。

1. goofysインストール

早速 goofys のインストールから初めていきます。

1-1. fuse

まずは fuse をインストールします。

 # yum install fuse

元々 fuse は s3fs で必要だったためソースでインストールしていました。
ただ goofys 導入後にいざ S3バケットをマウントする所で上手くいかなかったため
ソースでインストールした fuse を remove し、 yum で入れ直しております。

もし fuse をソースでインストールされている環境で
goofys が上手くいかないという方は、パッケージをお試しください。

1-2. go

次は go のインストールです。
GOROOT と GOPATH は /usr/local に配置したいと思います。

 GOROOT=/usr/local/go
 GOPATH=/usr/local/gocode

 # wget https://storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz
 # tar -xzf go1.8.3.linux-amd64.tar.gz
 # mv go /usr/local
 # mkdir /usr/local/gocode
 # mkdir /usr/local/gocode/{src,bin,pkg}

次は環境変数の設定です。

 # echo export GOROOT=/usr/local/go >> ~/.bash_profile
 # echo export GOPATH=/usr/local/gocode >> ~/.bash_profile
 # source ~/.bash_profile
 # echo export PATH=$PATH:$GOROOT/bin:$GOPATH/bin >> ~/.bash_profile
 # source ~/.bash_profile
 # go version
go version go1.8.3 linux/amd64

go の導入が完了しました。

1-3. goofys

では早速 goofys を導入していきたいと思います。

 # go get github.com/kahing/goofys
 # go install github.com/kahing/goofys

goofys導入も完了しました。

ここでもつまづいたので共有させて頂きたきます。

最初構築する際に何も考えずに、WEBから諸先輩方の記事にあるコマンドを
そのまま実行したのですが記事が古く、
最新ではないバージョンの goofys がインストールされてしまいました。

問題ないべっ!とそのまま進めてしまっていたのですが、結果上手くいかず。。
理由としては Content-Type です。

最新の goofys では –use-content-type という
/etc/mime.types に従って Content-Type を設定してくれるオプションがあるのですが
古いバージョンにはそれがなく、 goofys 経由で画像などを格納した所、
S3側でのシステムメタデータが binary となり
画像が表示されないという苦渋を舐めさせられました。

用途によっては必要ないとは思いますが、もし必要であればお気をつけ下さい。

因みにS3バケット側のバケットポリシーも是非あけておいて下さい。
Content-Type を設定した後の話ですが、
jpeg を格納したのになぜか S3 側のシステムメタデータで xml と認識され Content-Type か!?
と悩んでいたのですが素直に 「403 permission denied」 が格納されているだけでした。

1-4. awscli

次は awscli を導入します。

 # curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
 # python3.5 get-pip.py
 # pip install awscli

aws cliのセットアップも実施します。

 # aws configure
AWS Access Key ID [********************]: XXXXXXXXXXXXXXXXXX
AWS Secret Access Key [********************]: XXXXXXXXXXXXXXXXXX
Default region name [ap-northeast-1]: ap-northeast-1
Default output format [None]: json

ここまで必要なものは全てインストールしました。

例によってまさかのここでもつまづいております。
これは完全に goofys とは直接関係のない問題なので詳細は記載致しませんが、
curl のパッケージ が低かったり、python 2.6だと pip install で
syntax error が発生したりなど散々でございました。
今ではいい思い出です。

ではマウントしていきます。

2. マウント

今回はリブートしてもアンマウントされないように fstab に記載します。

 # cat /etc/fstab
LABEL=centos_root       /        ext4      defaults         0 0
devpts     /dev/pts  devpts  gid=5,mode=620   0 0
tmpfs      /dev/shm  tmpfs   defaults         0 0
proc       /proc     proc    defaults         0 0
sysfs      /sys      sysfs   defaults         0 0
/swapfile swap swap defaults 0 0
/usr/local/gocode/bin/goofys#goofys-test. /goofys fuse _netdev,allow_other,--file-mode=0666,-uid=80,--gid=80,--region=ap-northeast-1,--use-content-type 0 0

設定としては以下です。

オプション 説明
_netdev ネットワークが有効になるまでマウントを待つため指定
allow_other マウントしたユーザ以外のユーザも利用できるようにする
–file-mode マウントする際のファイル権限を設定
–uid マウントするユーザーIDを指定
–gid マウントするグループIDを指定
–region リージョンを指定。通常は自動で検出されるらしいです。デフォルトは us-east-1 とのこと
–use-content-type /etc/mime.types に従って Content-Type を設定

ではマウントを実施し、出来ているかを確認します。

 # mount -a
 # mount

goofys-test on /goofys type fuse (rw,allow_other,default_permissions)

出来ました。
では ls コマンドを発行してみます。

 # ls -l /goofys
drwxr-xr-x 2 www www 4096 2017-11-10 14:47 test

参照も可能ですね。

3. s3fs vs goofys 速度検証

簡単に速度検証してみました。
参照系で ls コマンドを、書き込み系で cp コマンドを10回程発行し、
それぞれで速度をとります。
尚、 cp コマンドでコピーする元ファイルのサイズは約5MBです。

結果は以下です。

ls 結果

回数 goofys s3fs
1 4 sec 30 sec
2 2 sec 34 sec
3 2 sec 29 sec
4 2 sec 36 sec
5 2 sec 31 sec
6 2 sec 34 sec
7 2 sec 31 sec
8 1 sec 32 sec
9 2 sec 35 sec
10 4 sec 33 sec
平均 2 sec 33 sec

cp 結果

回数 goofys s3fs
1 1 sec 1 sec
2 0 sec 1 sec
3 1 sec 1 sec
4 2 sec 2 sec
5 0 sec 1 sec
6 3 sec 2 sec
7 0 sec 2 sec
8 0 sec 2 sec
9 1 sec 2 sec
10 1 sec 2 sec
平均 1 sec 2 sec

特に ls に関しては goofys が圧倒的に早いですね。
これでストレスが解消されます。

まとめ

今回は goofys のインストールから s3fs との速度検証を実施しました。
構築自体は七転び八起きでしたが、いい結果で出て良かったです。
s3fs を使用していらっしゃる方は是非参考にしていただけると嬉しいです。

ご清覧頂きありがとうございました。
Wedding Parkでは一緒に技術のウエディングパークを創っていくエンジニアを募集しています。
興味のある方はぜひ一度気軽にオフィスに遊びにいらして頂ければと思います。

IT×ブライダルで業界を変える!プロフェッショナルなWEBエンジニア募集!

Join Us !

ウエディングパークでは、一緒に働く仲間を募集しています!
ご興味ある方は、お気軽にお問合せください(カジュアル面談から可)

採用情報を見る