こんにちは。SREチーム インフラエンジニアの綿引です。
本日は goofys という AWS S3 マウント用ソリューションの
インストールについて記載しようと思います。
goofysとは
goofys とはサーバから S3 バケットをファイルシステムのようにマウントして、
OS上からディレクトリの様に使用できるソリューションです。
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では一緒に技術のウエディングパークを創っていくエンジニアを募集しています。
興味のある方はぜひ一度気軽にオフィスに遊びにいらして頂ければと思います。