Posted at

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

More than 3 years have passed since last update.


はじめに

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を修正します。


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確認

$ 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よりかなり優秀な感じですが、実際比較はまだしてないのでそっちの方もできたらなと思っています。

また、実際に利用している方がいましたらそこらへんの情報についてコメントいただけると嬉しいです。