はじめに
AWSを利用していて、S3をサーバーマウントする技術としてs3fs
が有名だと思います。
ですが、s3fsは遅いと感じる人は少なくないかと思います。
そこで他に何かないかなと思って調べたところ、**goofys**というのがあるみたいです。
goofysのREADMEに、以下の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よりかなり優秀な感じですが、実際比較はまだしてないのでそっちの方もできたらなと思っています。
また、実際に利用している方がいましたらそこらへんの情報についてコメントいただけると嬉しいです。