[S3] OS X に goofys 入れて S3 をマウントする

[goofys](https://github.com/kahing/goofys) 使うと、S3バケットを直接マウントしてファイルシステムのように使用することが可能ですが、[Homebrew](http://brew.sh/index_ja.html) 使えばわりかし簡単に OS X でも使用できたので、やり方をさらっと

## 環境整備

### Homebrew インストール
まずは、Homebrew が入ってないと話になりません。
入ってない場合はいれましょう。

```bash
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

参考: [Homebrew](http://brew.sh/index_ja.html)

### golang インストール
Homebrew 入れたら、次は golang のインストール

```bash
$ brew install golang
$ [ ! -e ~/go/ ] && mkdir ~/go
$ export GOROOT=/usr/local/opt/go/libexec
$ export GOPATH=$HOME/go
$ export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
```

export で始まる3行は ~/.bash_profile にも書いておいた方がいいでしょう。

### FUSE for OS X インストール
次に FUSE for OS X をインストール

Homebrew Cask が入ってない場合はインストール

```bash
$ brew install caskroom/cask/brew-cask
```

FUSE for OS Xをインストール

```bash
$ brew cask install osxfuse
```

参考: [OS X YosemiteでNTFSフォーマットのディスクに書き込めるようにする](http://qiita.com/ganta/items/f9cc7189e3efe417262f)

### awscli インストール
awscli 入れて configure

```bash
$ brew install awscli
$ aws configure
```

### goofys インストール
goofys をインストール

```bash
$ go get github.com/kahing/goofys
$ go install github.com/kahing/goofys
$ goofys -h
Error: goofys takes exactly two arguments.

NAME:
   goofys - Mount an S3 bucket locally

USAGE:
   goofys [global options] bucket[:prefix] mountpoint
   
VERSION:
   0.0.6
   
GLOBAL OPTIONS:
   --help, -h			Print this help text and exit successfuly.
   -o value			Additional system-specific mount options. Be careful!
   --dir-mode value		Permissions bits for directories. (default: 0755) (default: 493)
   --file-mode value		Permission bits for files (default: 0644) (default: 420)
   --uid value			UID owner of all inodes. (default: 500)
   --gid value			GID owner of all inodes. (default: 500)
   --endpoint value		The non-AWS endpoint to connect to. Possible values: http://127.0.0.1:8081/
   --region value		The non-AWS endpoint to connect to. Possible values: us-east-1, us-west-1, us-west-2, eu-west-1, eu-central-1, ap-southeast-1, ap-southeast-2, ap-northeast-1, sa-east-1, cn-north-1 (default: "us-west-2")
   --storage-class value	The type of storage to use when writing objects. Possible values: REDUCED_REDUNDANCY, STANDARD, STANDARD_IA. (default: "STANDARD")
   --use-path-request		Use a path-style request instead of virtual host-style. (deprecated, always on)
   --profile value		Use a named profile from $HOME/.aws/credentials instead of "default"
   --use-content-type		Set Content-Type according to file extension and /etc/mime.types (default: off)
   --stat-cache-ttl value	How long to cache StatObject results and inode attributes. (default: 1m0s)
   --type-cache-ttl value	How long to cache name -> file/dir mappings in directory inodes. (default: 1m0s)
   --debug_fuse			Enable fuse-related debugging output.
   --debug_s3			Enable S3-related debugging output.
   -f				Run goofys in foreground.
   --version, -v		print the version
```

## goofys の使用方法

### マウント
goofys でマウントするには、以下の感じでやります

```bash
$ goofys -o allow_other --uid {uid} --gid {gid} --region {リージョン} {s3バケット名} {マウントポイント}
```

uid と gid は id コマンドで調べましょう。

```bash
$ id
uid=501(wokamoto) gid=20(staff) groups=20(staff),...
```

wokamoto ユーザの uid は 501 で、gid 20 の staff グループに所属してるみたいですね。

例えば ap-northeast-1 にある s3-example って S3 バケットを ~/s3 にマウントしたい場合は、以下のとおり。

```bash
$ goofys -o allow_other --uid 501 --gid 20 --region ap-northeast-1 s3-example ~/s3
```

やったー 1PB のボリュームとして認識されたよ

```bash
$ df -h
Filesystem                                  Size   Used  Avail Capacity  iused      ifree %iused  Mounted on
/dev/disk1                                 233Gi  205Gi   27Gi    89% 53803254    7182088   88%   /
devfs                                      199Ki  199Ki    0Bi   100%      688          0  100%   /dev
map -hosts                                   0Bi    0Bi    0Bi   100%        0          0  100%   /net
map auto_home                                0Bi    0Bi    0Bi   100%        0          0  100%   /home
s3-example                                 1.0Pi    0Bi  1.0Pi     0%        0 1000000000    0%   /Users/wokamoto/s3
```

### うまくいかない時は...
goofys コマンドがうまくいかない場合は -f とか --debug_s3 とか --debug_fuse パラメータつけて起動すればなんかメッセージでます。

```bash
$ goofys -o allow_other --uid 501 --gid 20 --region ap-northeast-1 --debug_s3 --debug_fuse -f s3-example ~/s3
2016/06/17 16:42:31.029518 s3.DEBUG DEBUG: Request s3/HeadBucket Details:
---[ REQUEST POST-SIGN ]-----------------------------
HEAD http://s3-ap-northeast-1.amazonaws.com/s3-example HTTP/1.1
Host: s3-ap-northeast-1.amazonaws.com
User-Agent: aws-sdk-go/1.0.0 (go1.6; darwin; amd64)
Authorization: AWS4-HMAC-SHA256 ...
```

### アンマウント
アンマウントしたい時は ```sudo umount {マウントポイント}``` で
例えば ~/s3 にマウントしていたのであれば...

```bash
$ sudo umount ~/s3
```

良い S3 ライフを！