goofysの設定手順

# 目的

EC2インスタンスをS3にマウントするソフトウェアであるGoofyの設定手順について解説します。


# 前提

この手順を実施する前に以下条件が整っていることを確認します。

- EC2: Amazon Linux 2をAMIとしたEC2インスタンスが起動していること。
- S3: EC2にアクセスができるバケットを作成し、権限が設定してあること。
- IAM: アクセスキー&シークレットキーなどの接続情報が払い出されていること。


# 設定手順（一時利用）


## 1.　前提ソフトウェアのインストール 
前提ソフトウェアである以下パッケージ一覧についてインストールします。

- golang
  -  goofyがGO実行環境で動作するため   
- Filesystem in Userspace (FUSE) : 
  -  Unix系コンピュータオペレーティングシステム用のソフトウェアインタフェース。goofyはこの仕組みを利用している。
- git
  -  GitHub上のgoofyをインストールする時に必要。

```bash
sudo yum install golang fuse git -y
```

各前提ソフトウェアのバージョンは以下の通り。

```bash
go version
go version go1.13.4 linux/amd64
git --version
git version 2.14.5
fusermount -V
fusermount version: 2.9.4
```

## 2.　GOPATHを設定する

GOPATHを設定します。GOPATHとは Go言語では、環境変数GOPATHに保存されたパス（以降、単にGOPATHと呼びます）を開発時の作業ディレクトリとして扱います

```bash
export GOPATH=${HOME}/go
```


## 3.　goofysをGitHubからインストール

[Github](https://github.com/kahing/goofys)上からgoofysをインストールします。

```bash
go get github.com/kahing/goofys
go install github.com/kahing/goofys
```


## 4.　goofysにマウントするディレクトリを作成


goofysにマウントするディレクトリを作成します。他ユーザーからアクセスすることを想定して、root権限でしかアクセスできない階層にはマウントすディレクトリを作成しないように注意してください。　作者の設定手順のページには記載がありませんでしたが、読み書きの権限で怒られることもあるので、chmodで適切に権限を付与します（ここはオプションなので、場合に応じて設定してください）。

```bash
mkdir /home/ec2-user/mount-goofys
```

```bash
chmod 777 /home/ec2-user/mount-goofys
```



## 5.　awsの認証情報（aws credentials）を設定

aws credentialsを直接編集しても良いですが、aws configureコマンドを使用すれば、簡単に編集できるので、今回はこちらを利用します。AMIによっては、aws cliが入っていない場合もあるので、その場合はaws cliをインストールする必要があります。aws credentialsの詳細な設定手順は、[こちら](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-files.html)をご参照願います。
なぜ、```sudo aws configure```も実行する必要があるかと言うと、自動マウントの設定（fstab）を利用する際に利用するためです(fstabはroot権限でしか利用できない)。作者のページにも、```To mount an S3 bucket on startup, make sure the credential is configured for root```との記述があります。```sudo aws configure```を実行することで、rootユーザーのaws credentialsも設定することが可能です。

```bash
aws configure
AWS Access Key ID [None]: XXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXX
Default region name [None]: XXXXXXXXXXXXXXXXX
Default output format [None]: XXXXXXXXXXXXXXXXX

sudo aws configure
AWS Access Key ID [None]: XXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXX
Default region name [None]: XXXXXXXXXXXXXXXXX
Default output format [None]: XXXXXXXXXXXXXXXXX
```



## 6.　マウントコマンドの実行

以下コマンドを実行して、既に作成済みのbucket(bucket-XXX )に対して、ディレクトリ（/home/ec2-user/mount-goofys）をマウントします。

```bash
$GOPATH/bin/goofys bucket-XXX /home/ec2-user/mount-goofys
```

```df```コマンドで無事マウントされていることを確認します。

```bash
df
Filesystem         1K-blocks    Used     Available Use% Mounted on
devtmpfs            16451592       0      16451592   0% /dev
tmpfs               16469640       0      16469640   0% /dev/shm
tmpfs               16469640     492      16469148   1% /run
tmpfs               16469640       0      16469640   0% /sys/fs/cgroup
/dev/xvda1           8376300 3089196       5287104  37% /
tmpfs                3293932       0       3293932   0% /run/user/1000
tmpfs                3293932       0       3293932   0% /run/user/0
bucket-XXX    1099511627776       0 1099511627776   0% /home/ec2-user/mount-goofys ←ここです。
```

# 設定手順（恒久利用）

## 7.　fstabを編集して、再起動後もマウントされるように設定

fstabを編集することで、EC2が再起動した後も、S3にマウントするように設定します。
その前に手順6で設定したマウントをumountコマンドで解除します。


```bash
sudo umount /home/ec2-user/mount-goofys/
```

ここは一般的なfstabの設定と基本的には同様です。uidとgidを設定する場合は、idコマンドを利用して、それらを確認する必要があります。私の場合、該当ユーザーのuidとgidが共に1000であったため、これらの情報をfstabに設定します。

```bash
id
uid=1000(ec2-user) gid=1000(ec2-user) groups=1000(ec2-user),4(adm),10(wheel),190(systemd-journal)
```

次に、```/etc/fstab```を編集します。[Githubのページ](https://github.com/kahing/goofys)と上記で確認したコマンドを参考に、設定する必要があります。

```bash
sudo vim /etc/fstab 
/home/ec2-user/go/bin/goofys#bucket-XXX /home/ec2-user/mount-goofys fuse _netdev,allow_other,--dir-mode=0777,--file-mode=0777,--uid=1000,--gid=1000 0 0
```

```mount -a```することで設定は完了です。

```bash
sudo mount -a
```

ここで、golangの環境変数も永続化しておきます。Githubには記載がありませんでしたけど、念のためです。

```bash
vim /home/ec2-user/.bash_profile 
export GOPATH=${HOME}/go
```

再起動します。

```bash
sudo reboot
```

ここで問題が発生します。```df```コマンドでマウントしていることは確認ができたのですが、なぜか書き込みを行うことができません。。[Github issue](https://github.com/kahing/goofys/issues/483)を確認すると、ftabを利用した方法だとRead-onlyとなってしまう事象が発生していることが記載してあります。どうやらレグレッションっぽいですね。



## 8.　bash_profileで自動起動を設定

仕方なしにbash_profileに直接書き込むことで、自動起動を設定することに。これで設定完了。

```bash
vim /home/ec2-user/.bash_profile
$GOPATH/bin/goofys bucket-XXX /home/ec2-user/mount-goofys
```

以上です。