Goofysを使ってAmazon S3バケットをファイルシステムにマウントする

# What's？

Amazon S3をファイルシステムとしてマウントできたらなぁと思って少し調べたら、[s3fs](https://github.com/s3fs-fuse/s3fs-fuse)というのが有名だということがわかりまして。

なんですけど、手元の環境ではs3fsでは上手くいかなかったので、Goofysに変えてみたところうまくいったので、こちらで試してみました。

[Goofys](https://github.com/kahing/goofys)


# Goofys

Goofysは、Amazon S3バケットをファイルシステムとしてマウントできるソフトウェアです。Goで実装されています。

s3fsよりもパフォーマンスが良いことが売りなようですが、s3fsの紹介を読むと代わりにPOSIX互換性は落ちるようです。

> goofys - similar to s3fs but has better performance and less POSIX compatibility

[s3fs / Reference](https://github.com/s3fs-fuse/s3fs-fuse#references)


# 環境
今回の環境は、こちらです。

```shell
$ cat /etc/redhat-release 
CentOS Linux release 7.8.2003 (Core)


$ uname -srvmpio
Linux 3.10.0-1127.10.1.el7.x86_64 #1 SMP Wed Jun 3 14:28:03 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
```

CentOS 7ですね。


# Goofysをインストールする

Goofysの手順に従って、インストールします。

[Installation](https://github.com/kahing/goofys#installation)

Linuxの場合はビルド済みのバイナリがあるので、こちらをダウンロードします。`/usr/loca/bin`に配置しましょう。

```shell
$ sudo curl -L https://github.com/kahing/goofys/releases/latest/download/goofys -o /usr/local/bin/goofys
$ sudo chmod a+x /usr/local/bin/goofys
```

バージョンを確認。

```shell
$ goofys --version
goofys version 0.24.0-45b8d78375af1b24604439d2e60c567654bcdf88
```


# S3バケットを用意する

マウント対象となるS3バケットを用意します。

```shell
$ aws s3api create-bucket --bucket charon-test-bucket --create-bucket-configuration LocationConstraint=ap-northeast-1
```

ファイルも置いておきましょう。

```shell
$ echo 'Hello S3!!' | aws s3 cp - s3://charon-test-bucket/hello.txt
$ echo 'Hello S3!! in sub dir' | aws s3 cp - s3://charon-test-bucket/dir/hello.txt
```

確認。

```shell
$ aws s3 cp s3://charon-test-bucket/hello.txt - 
Hello S3!!

$ aws s3 cp s3://charon-test-bucket/dir/hello.txt - 
Hello S3!! in sub dir
```

これで、準備はOKです。


# S3バケットをファイルシステムとしてマウントする

では、作成したS3バケットをファイルシステムとしてマウントしてみましょう。

[Usage](https://github.com/kahing/goofys#usage)

AWSのクレデンシャルは、今回は環境変数で設定しました。

```shell
export AWS_ACCESS_KEY_ID=xxxxx
export AWS_SECRET_ACCESS_KEY=xxxxx
export AWS_DEFAULT_REGION=ap-northeast-1
```

マウント先のディレクトリを作成。

```shell
$ mkdir $HOME/charon-test-bucket
```

マウント。

```shell
$ goofys charon-test-bucket $HOME/charon-test-bucket
```

すごく、あっさりとマウントできました。

```shell
$ df -h
Filesystem          Size  Used Avail Use% Mounted on
devtmpfs            912M     0  912M   0% /dev
tmpfs               919M     0  919M   0% /dev/shm
tmpfs               919M  8.5M  911M   1% /run
tmpfs               919M     0  919M   0% /sys/fs/cgroup
/dev/vda1            40G  3.2G   37G   8% /
tmpfs               184M     0  184M   0% /run/user/1000
charon-test-bucket  1.0P     0  1.0P   0% $HOME/charon-test-bucket
```

`ls`で見てみます。

```shell
$ ls -l charon-test-bucket 
total 5
drwxr-xr-x. 2 xxxxx xxxxx 4096 Jun 20 13:00 dir
-rw-r--r--. 1 xxxxx xxxxx   11 Jun 20 11:48 hello.txt
```

ディレクトリ内に入って、ファイルを見てみましょう。

```shell
$ cd charon-test-bucket 


$ cat hello.txt 
Hello S3!!


$ cat dir/hello.txt  
Hello S3!! in sub dir
```

OKですね。

ファイルやディレクトリも作成してみましょう。

```shell
$ echo 'Hello Goofys!!' > test.txt
$ mkdir dir2
$ echo 'Hello Goofys!! in sub dir' > dir2/test.txt
```

AWS CLIで確認。

```shell
$ aws s3 cp s3://charon-test-bucket/test.txt - 
Hello Goofys!!
$ aws s3 cp s3://charon-test-bucket/dir2/test.txt - 
Hello Goofys!! in sub dir
```

なお、バージョニングを有効にしている場合はファイルを更新するとバージョンが更新されますし、`rm`しても削除マークのついたバージョンが増えるという挙動になるのはAWS CLIなどを使った場合と変わりません。


# アンマウントする

マウントしたS3バケットをアンマウントするには、`fusermount`で。

```shell
$ fusermount -u $HOME/charon-test-bucket
```