goofysを使ってAmazon LinuxにS3をマウントする。

はじめに

AWSを利用していて、S3をサーバーマウントする技術としてs3fsが有名だと思います。 ですが、s3fsは遅いと感じる人は少なくないかと思います。 そこで他に何かないかなと思って調べたところ、**goofys**というのがあるみたいです。

goofysのREADMEに、以下のBenchmarkが載っていました。

goofys-benchmark

ということで、とりあえずgoofysを使ってS3をマウントしたいと思います。


# goとfuseのインストール まず、goofysを利用するにあたり、goとfuseが必要となるためパッケージをインストールします。
$ sudo yum install golang fuse

_golang_をインストールする際に依存関係がたくさんあるため_yum_で一気にインストールしてしまいましょう。


# AWS CLIの設定 _aws cli_環境を設定します。
$ aws configure
AWS Access Key ID [None]: ********************
AWS Secret Access Key [None]: ****************************************
Default region name [None]: ap-northeast-1
Default output format [None]:

# バケットの作成

_aws cli_環境の設定ができたらマウントするためのバケットを作成します。

$ aws s3 mb s3://kohei-goofys
make_bucket: s3://kohei-goofys/
$ aws s3 ls s3://kohei-goofys

作成したばかりだとバケットには何も無いのでaws s3 lsしても戻り値はありません。


# goofysインストール

まず、GOPATHを設定します。

$ export GOPATH=$HOME/go
$ echo $GOPATH
/home/ec2-user/go

今回は_ec2-user_のホームディレクトリにインストールするようにしています。 設定ができたらインストールです。

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

*getもinstallもプロンプトが戻ってくるまでに若干時間がかかる可能性があります。


# S3マウント インストールができたらいよいよマウントです。
$ mkdir ~/mount-goofys
$ ./go/bin/goofys kohei-goofys ~/mount-goofys

プロンプトが帰ってきたら完了です。 マウントに成功してもしなくても、何も戻ってこないので実際に確認してみます。


# 確認 確認ポイントは幾つかあります。
$ ps auxf |grep goofys
ec2-user  3030  0.0  0.4 110472  2144 pts/0    S+   03:08   0:00              \_ grep --color=auto goofys
ec2-user  3022  0.3  2.7 197876 13668 ?        Ssl  03:08   0:00 /home/ec2-user/go/bin/goofys kohei-goofys /home/ec2-user/mount-goofys
$ sudo grep goofys /var/log/messages
Jul  1 03:08:50 ip-172-31-3-125 /home/ec2-user/go/bin/goofys[3022]: s3.ERROR code=incorrect region, the bucket is not in 'us-west-2' region msg=301 request=#012
Jul  1 03:08:51 ip-172-31-3-125 /home/ec2-user/go/bin/goofys[3022]: s3.INFO Switching from region 'us-west-2' to 'ap-northeast-1'
Jul  1 03:08:51 ip-172-31-3-125 /home/ec2-user/go/bin/goofys[3022]: main.INFO File system has been successfully mounted.
$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/xvda1       7.8G  1.6G  6.1G   21% /
devtmpfs         238M   56K  238M    1% /dev
tmpfs            246M     0  246M    0% /dev/shm
kohei-goofys     1.0P     0  1.0P    0% /home/ec2-user/mount-goofys

無事マウントができたようです。 では、ファイルの作成を行います。

$ touch ~/mount-goofys/test
$ ls ~/mount-goofys/
test

作成できたらaws s3コマンドでバケット内を直接確認してみます。

$ aws s3 ls s3://kohei-goofys
2016-07-01 03:14:44          0 test

先ほど作成されたコマンドがこちらからでも確認できました。


# 自動マウント設定

マウントはできるようになりましたが、毎回手動でマウントするのは大変です。 なので_/etc/fstab_にサーバー起動時にマウントされるように設定します。

ただ、ここでポイントはサーバー起動時は_root_で処理が実行されます。 ということは_aws cli_の設定もrootで行う必要があります。

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

設定ができたら_fstab_を修正します。

$ sudo vi /etc/fstab
$ cat /etc/fstab
#
LABEL=/     /           ext4    defaults,noatime  1   1
tmpfs       /dev/shm    tmpfs   defaults        0   0
devpts      /dev/pts    devpts  gid=5,mode=620  0   0
sysfs       /sys        sysfs   defaults        0   0
proc        /proc       proc    defaults        0   0
/home/ec2-user/go/bin/goofys#kohei-goofys /home/ec2-user/mount-goofys fuse _netdev,allow_other,--file-mode=0666,--uid=500,--gid=500 0 0

ここでとても重要なのがオプションで_allow_other_が指定されていることです。 このオプションがないとroot以外のユーザーからは見えなくなってしまいます。 また、—file-mode_と—uid_、_—gid_はファイルやディレクトリが作成された際のデフォルト権限/所有者の設定になります。

今回の場合は_ec2-user_がUID、GIDともに500でした。

$ id
uid=500(ec2-user) gid=500(ec2-user) groups=500(ec2-user),10(wheel)

修正が完了したら自動マウントを確認します。

$ sudo mount -a
$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/xvda1       7.8G  1.6G  6.1G   21% /
devtmpfs         238M   56K  238M    1% /dev
tmpfs            246M     0  246M    0% /dev/shm
kohei-goofys     1.0P     0  1.0P    0% /home/ec2-user/mount-goofys

ちゃんとマウントができたのが確認できます。 もし、ここでマウントが見えなかったらsudo df -hを試してみてください。 それで見える場合は権限周りがうまくできてない可能性があります。

オプション説明
_netdevネットワークが有効になるまでマウントを待つためのオプション。
ネットワーク経由のデバイスを起動時にマウントさせたい場合などに指定する。
allow_other他のユーザーでも利用できるようにする。
—file-modeマウントする際のファイル権限を設定する。
—uidマウントするユーザーIDを指定する。
—gidマウントするグループIDを指定する。

また、上記は今回使ったオプションの説明となるので参考にしてもらえればと思います。


# おわりに

とりあえずgoofysがどんな感じかを試したくて行いましたが、導入はとても簡単でした。 ただ、自動マウント設定の際のアクセス権限周りの挙動を確認するのに少々時間かかったかなという感じです。 GitHubのBenchmarkではs3fsよりかなり優秀な感じですが、実際比較はまだしてないのでそっちの方も検証できたらなと思っています。