Oracle Cloud Infrastructure(OCI) にgoofysを入れてみた

# 今回の内容
EC2はgoofysを使用してS3をマウントすることが可能。
Oracle Cloud InfrastructureのObject StorageもS3互換APIを持ち合わせているため
goofysをインストールして、マウントできるかを確かめてみた。

## 前提
- Computeインスタンスが作成されていること  
[この時に作ったインスタンスを使用](https://qiita.com/untitle_23/items/af4e6b9fb00cf5981e32)
- Object StorageのBucketが作成されていること  
[この時に作ったBucketを使用、画面ショット等は特に無し](https://qiita.com/untitle_23/items/c7176e70ea2773a92de5)
- API実行用ユーザーが作成されていて、S3互換APIに必要なKeyが設定されていること  
※今回は上記のS3互換APIに必要なKey作成についても記載する。

## 1. S3互換API用ユーザー作成
### 1-1. ユーザーの作成

`Identity` > `Users` と進み`Create User`を押す

[Create User画面]
<img width="479" alt="001.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/278065/10aee7bc-9851-94c0-2ab6-f368a30cafcd.png">
`NAME`に任意の名前(goofysなど)、`DESCRIPTION`にも任意の値(For goofysなど)を入れて`Create`を押す

### 1-2. グループの設定
`Identity` > `Users` > `1-1で作成したユーザー名` > `Groups` と進み、`Add User to Group`を押す

[Add User to Group画面]
<img width="474" alt="002.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/278065/5f8bc9e4-863d-0e20-ed6d-1e5224d12436.png">
`GROUPS`に`Administrators`を選択し、`Add`を押す
※**本来はObject Storageしか触れないPolicyが設定されたGroupを作成して設定する方が良いが今回は省略する。**

### 1-3. Keyの作成
`Identity` > `Users` > `1-1で作成したユーザー名` > `Customer Secret Key` と進み、`Generate Secret Key`を押す

[Generate Secret Key画面]
<img width="472" alt="003.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/278065/ad00bcb8-944c-dc53-1d4c-70e3539f8009.png">
`NAME`に任意の名前(goofysなど)を入れて`Generate Secret Key`を押す
そうすると下記のSecret Keyが表示される。
※1度しか表示されないため、コピーしておくこと！ ---★1

[Generateされた画面]
<img width="473" alt="004.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/278065/d7604fd0-5072-4d1c-77d8-681ee433e1a3.png">


また、下記画面も今後の設定に必要なためコピーしておくこと！ ---★2
※`Name`が作成した内容の個所でCopyを押す。
<img width="959" alt="005.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/278065/e80f6227-0b42-80d0-6dfc-975d6fa657cd.png">

## 2. goofysのインストール
作成してあるComputeのインスタンスにgoofysをインストールする。
goofysを使用可能にするには以下が必要。

- golang (実際はgoofysをbuildするために必要)
- fuse (マウントするために必要)
- git (実際はgoofysをgitからダウンロードしてくるために必要)

Computeインスタンスに必要なのは、**goofysとfuseのコマンドだけ**なので
どこかworkサーバーでコンパイルしたものを配布した方がgolang、gitをインストールしなくて綺麗かも。。今回はそこまで考えずに実行していく。

### 2-1. golang、fuse、gitのインストール

```
### golang、fuseのインストール
[opc@hostname ~]$ sudo yum install golang fuse
～省略～

========================================================================================================================
 Package                    Arch               Version                            Repository                       Size
========================================================================================================================
Installing:
 fuse                       x86_64             2.9.4-1.0.4.el7                    ol7_latest                       86 k
 golang                     x86_64             1.9.4-1.el7                        ol7_optional_latest             610 k
Installing for dependencies:
 cpp                        x86_64             4.8.5-36.0.1.el7                   ol7_latest                      5.9 M
 gcc                        x86_64             4.8.5-36.0.1.el7                   ol7_latest                       16 M
 glibc-devel                x86_64             2.17-260.0.15.el7_6.3              ol7_latest                      1.1 M
 glibc-headers              x86_64             2.17-260.0.15.el7_6.3              ol7_latest                      685 k
 golang-bin                 x86_64             1.9.4-1.el7                        ol7_optional_latest              48 M
 golang-src                 noarch             1.9.4-1.el7                        ol7_optional_latest             5.1 M
 kernel-headers             x86_64             3.10.0-957.5.1.el7                 ol7_latest                      8.0 M
 libmpc                     x86_64             1.0.1-3.el7                        ol7_latest                       49 k
 mpfr                       x86_64             3.1.1-4.el7                        ol7_latest                      198 k
Updating for dependencies:
 glibc                      x86_64             2.17-260.0.15.el7_6.3              ol7_latest                      3.7 M
 glibc-common               x86_64             2.17-260.0.15.el7_6.3              ol7_latest                       12 M

Transaction Summary
========================================================================================================================
Install  2 Packages (+9 Dependent packages)
Upgrade             ( 2 Dependent packages)

Total download size: 101 M
Is this ok [y/d/N]: y

～省略～

Installed:
  fuse.x86_64 0:2.9.4-1.0.4.el7                               golang.x86_64 0:1.9.4-1.el7                              

Dependency Installed:
  cpp.x86_64 0:4.8.5-36.0.1.el7                             gcc.x86_64 0:4.8.5-36.0.1.el7                              
  glibc-devel.x86_64 0:2.17-260.0.15.el7_6.3                glibc-headers.x86_64 0:2.17-260.0.15.el7_6.3               
  golang-bin.x86_64 0:1.9.4-1.el7                           golang-src.noarch 0:1.9.4-1.el7                            
  kernel-headers.x86_64 0:3.10.0-957.5.1.el7                libmpc.x86_64 0:1.0.1-3.el7                                
  mpfr.x86_64 0:3.1.1-4.el7                                

Dependency Updated:
  glibc.x86_64 0:2.17-260.0.15.el7_6.3                    glibc-common.x86_64 0:2.17-260.0.15.el7_6.3                   

Complete!

[opc@hostname ~]$ 

### gitのインストール
[opc@hostname ~]$ sudo yum install git
～省略～

========================================================================================================================
 Package                         Arch                  Version                          Repository                 Size
========================================================================================================================
Installing:
 git                             x86_64                1.8.3.1-20.el7                   ol7_latest                4.4 M
Installing for dependencies:
 perl-Error                      noarch                1:0.17020-2.el7                  ol7_latest                 31 k
 perl-Git                        noarch                1.8.3.1-20.el7                   ol7_latest                 55 k
 perl-TermReadKey                x86_64                2.30-20.el7                      ol7_latest                 30 k

Transaction Summary
========================================================================================================================
Install  1 Package (+3 Dependent packages)

Total download size: 4.5 M
Installed size: 22 M
Is this ok [y/d/N]: y

～省略

Installed:
  git.x86_64 0:1.8.3.1-20.el7

Dependency Installed:
  perl-Error.noarch 1:0.17020-2.el7     perl-Git.noarch 0:1.8.3.1-20.el7     perl-TermReadKey.x86_64 0:2.30-20.el7

Complete!
[opc@hostname ~]$ 
```

### 2-2. 取得とbuild
buildする場所は特にどこでも良いので適当に実施。

```
### goパスの設定
[opc@hostname ~]$ mkdir ~/go
[opc@hostname ~]$ export GOPATH=~/go
### 取得とbuild
[opc@hostname ~]$ go get github.com/kahing/goofys
[opc@hostname ~]$ echo $?
0
[opc@hostname ~]$ go install github.com/kahing/goofys
[opc@hostname ~]$ echo $?
0
### buildの確認
[opc@hostname ~]$ ls -l ~/go/bin/goofys
-rwxrwxr-x. 1 opc opc 14040170 Feb  4 11:36 /home/opc/go/bin/goofys
```

### 2-3. ファイルの配置
goofysのファイルをPATHが通る所に配置する。

```
[opc@hostname ~]$ sudo cp /home/opc/go/bin/goofys /usr/local/bin
[opc@hostname ~]$ sudo chown root:root /usr/local/bin/goofys
[opc@hostname ~]$ sudo chmod 775 /usr/local/bin/goofys
[opc@hostname ~]$ ls -l /usr/local/bin/goofys
-rwxrwxr-x. 1 root root 14040170 Feb  4 11:40 /usr/local/bin/goofys
```

## 3. 環境設定
goofysは基本的にはawscliを使用する。しかし、今回はOracle Cloud Infrastructureを使用するため細工が必要。awscliのcredentialsファイルを手動で作成する。
また、自動起動可能にするために、/etc/fstabにも設定を追加する。

### 3-1. 環境変数の設定
今回必要な環境変数は以下となる。
- aws_access_key_id <=== ★2で確認した値
- aws_secret_access_key <=== ★1で確認した値

再起動時にも自動でmountさせたいために、rootのhomeディレクトリに作成する。

```
### credentialsファイルの作成
[opc@hostname ~]$ sudo mkdir -p /root/.aws
[opc@hostname ~]$ sudo vi /root/.aws/credentials
### 以下を追記
[default]
aws_access_key_id = XXX <=== ★2で確認した値
aws_secret_access_key = XXX <=== ★1で確認した値
### ここまで
[opc@hostname ~]$ 
```

### 3-2. /etc/fstabの設定
最低限必要な追加内容としては以下と考える。

```
[opc@hostname ~]$ sudo cp -p /etc/fstab /etc/fstab.`date "+%Y%m%d%H%M%S"`
[opc@hostname ~]$ sudo vi /etc/fstab
### 以下を追記
goofys#<bucket名> <mountディレクトリ> fuse _netdev,allow_other,--endpoint=<Object Storageのエンドポイント>,--region=<リージョン> 0 0
### ここまで
```
もしも、IFやり取りするために使用したい場合は`--dir-mode=0755`,`--file-mode=0666`を入れた方が良いかもしれない。


## 4. テストの実施
設定が完了したため、テストを実施してみる。

### 4-1. コマンドのテスト
```
[opc@hostname ~]$ sudo mount -a
[opc@hostname ~]$ echo $?
0
[opc@hostname ~]$ df -h
df -h
Filesystem       Size  Used Avail Use% Mounted on
devtmpfs         7.2G     0  7.2G   0% /dev
tmpfs            7.3G     0  7.3G   0% /dev/shm
tmpfs            7.3G  8.6M  7.3G   1% /run
tmpfs            7.3G     0  7.3G   0% /sys/fs/cgroup
/dev/sda3         39G  5.0G   34G  13% /
/dev/sda1        200M  9.6M  191M   5% /boot/efi
tmpfs            1.5G     0  1.5G   0% /run/user/1000
<bucket名>       1.0P     0  1.0P   0% <mountディレクトリ>   ←☆出来ている！

[opc@hostname ~]$ cd <mountディレクトリ>
[opc@hostname ~]$ sudo touch test.log
[opc@hostname ~]$ ls -l
-rw-r--r--. 1 root root          0 Feb  4 12:52 test.log     ←☆ちゃんと出来ている！

[opc@hostname ~]$ sudo mkdir test
[opc@hostname ~]$ ls -l
drwxr-xr-x. 2 root root       4096 Feb  4 12:52 test     ←☆ディレクトリも出来ている！
-rw-r--r--. 1 root root          0 Feb  4 12:52 test.log

[opc@hostname ~]$ sudo touch test/test2.log
[opc@hostname ~]$ ls -l test/test2.log
-rw-r--r--. 1 root root 0 Feb  4 12:53 test/test2.log     ←☆これも出来ている！
```

### 4-2. 画面からの確認

`Object Storage` > `Object Storage` > `作成したBucket名` を押す
`Object`の画面で
- test.log
- testディレクトリ
- test/test2.log
が作成されていることを同じく確認。
※testディレクトリに関しては作成されないと考えていた。。。

[Objectの画面]
<img width="960" alt="006.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/278065/75ef22c0-b3fe-d92a-a1ec-765bb5b4d8e3.png">


画面からtestディレクトリを削除してみると、testディレクトリは削除され、test/test2.logは残ったままとなった。

[削除の確認画面]
<img width="473" alt="007.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/278065/73de5d8b-a923-23dc-5d2b-5cda79d20e0c.png">

[削除後のObjectの画面]
<img width="960" alt="008.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/278065/420962ee-a851-0091-dac7-6a669980fa0d.png">


しかし、コマンドで確認してみるとディレクトリは残っている状態となった。

```
[opc@hostname ~]$ ls -l
drwxr-xr-x. 2 root root       4096 Feb  4 12:52 test     ←☆ディレクトリは残っている！
-rw-r--r--. 1 root root          0 Feb  4 12:52 test.log
```

上記を考えると、goofysを使用した場合は、ディレクトリ作成とかはあまり実施しない方が良い気がする。