2016年4月18日月曜日

Goofysを使ってS3をマウント

Amazon S3のバケツをマウントしてファイル操作できるようにします。
S3をマウントする方法としてメジャーなs3fs-fuseというプロダクトがありますが、パフォーマンスが良くないです。色々調べたところ、よりパフォーマンスを重視した、Goofysというプロダクトがあったので、試してみました。
POSIXの規格を厳密に実装せず、パフォーマンスを重視した実装になっているそうです。

以下、セットアップ方法です。

環境
AMI: Amazon Linux AMI 2016.03.0 (HVM), SSD Volume Type - ami-f80e0596 
Type: c4.large

S3でバケツを作成しておきます。
バケツ名は my-goofys-bucket としました。

Goofysをセットアップ
Goとfuseをインストール。
$ sudo yum install -y golang fuse
Goofysをインストール。
$ sudo wget https://github.com/kahing/goofys/releases/download/v0.0.5/goofys -P /usr/local/bin/
$ sudo chmod 755 /usr/local/bin/goofys
$ /usr/local/bin/goofys -h
AWS CLIを設定。
$ aws configure 
AWS Access Key ID [None]: 
AWS Secret Access Key [None]: 
Default region name [None]: 
Default output format [None]:
マウントするディレクトリを作成。
$ mkdir ~/mountpoint
ユーザのidを確認。
$ id
uid=503(yako) gid=503(yako) groups=503(yako),10(wheel)
マウント。ここでは、オプションで、allow_other, uid, gidを付けます。現在のユーザ、rootユーザ以外でもディレクトリのファイルを見ることができるようにします。
$ sudo /usr/local/bin/goofys my-goofys-bucket ~/mountpoint -o allow_other,--uid=503,--gid=503
Goofysプロセスが立っているのがわかります。
$ ps auxf | grep goofys
yako      3624  0.0  0.0 110456  2196 pts/1    S+   05:41   0:00              \_ grep --color=auto goofys
yako      3586  0.0  0.4 223236 15592 ?        Ssl  05:38   0:00 /usr/local/bin/goofys my-goofys-bucket /home/yako/mountpoint
ログを確認。
# grep goofys /var/log/messages
Apr 15 05:38:37 ip-172-31-10-234 /usr/local/bin/goofys[3586]: s3.INFO Switching from region 'us-west-2' to 'ap-northeast-1'
Apr 15 05:38:37 ip-172-31-10-234 /usr/local/bin/goofys[3586]: main.INFO File system has been successfully mounted.
テストファイルを置いてみます。
$ touch mountpoint/test.txt
AWS CLIから確認。
$ aws s3 ls s3://my-goofys-bucket
2016-04-15 05:38:53          0 test.txt
ちゃんとファイルが設置されていますね。

アンマウントするには?
rootユーザでアンマウントを実行します。
ディレクトリを使用していないか確認。
$ sudo lsof | grep mountpoint
アンマウント実行
$ sudo umount /home/yako/mountpoint

リブート後も自動マウントされるようにするには?
fstabに追記します。
$ sudo vi /etc/fstab 
/usr/local/bin/goofys#my-goofys-bucket  /home/yako/mountpoint        fuse     _netdev,allow_other,--uid=503,--gid=503    0       0
rootユーザにAWS CLIを設定
$ sudo su 
# aws configure
リブート。
$ sudo su  reboot
起動したら、ファイルを確認してみます。
$ ls mountpoint/
test.txt
無事、マウントされていました。

Goofysが『やらないこと』
・S3に載せたファイルに任意のContent-Typeを設定しない。すべて、 binary/octet-stream になる。
・S3のアクセスコントロールの設定をしない。
もし、コントロールしたいときは、別のスクリプトや、AWS Lambdaを回して設定しましょう。

まとめ
Goofysを使って、S3をマウントしました。
1ヶ月くらい使っていますが、とくに問題は起きていないです。
S3にファイルを集中して損失リスクの責任を持たせるので、個人的には、自前で分散ファイルシステムのNFSを組むより安心感があります。
AWSでは、Amazon EFSを準備中で、プレビュー版を提供中です。リリースされたら、くらべてみたいですね。


Top photo from mezosurfer Goofy Golf Sign