IBM Cloud Object Storageを使ってみた

#内容IBM cloudで提供しているIBM Cloud ObjectStorage(ICOS)の使い方です。
LinuxからCLI(awscli)とFilesystem in Userspace(goofys)で利用してみました。

#参考記事

- [IBM Cloud ObjectStorage Document](https://ibm-public-cos.github.io/crs-docs/)
- [Qiita:goofysを使ってAmazon LinuxにS3をマウントする](http://qiita.com/kooohei/items/a14f22cb0381342d1861)
- [goofys:a high-performance, POSIX-ish Amazon S3 file system written in Go](https://github.com/kahing/goofys)

#ICOS(IBM Cloud Object Storage)とは
AWSのs3互換のオブジェクトストレージです。（旧cleversafe社の買収製品)
IBM cloudのストレージサービスの１つに組み込まれました。
IBM cloudでは従来のOpenstack SwiftベースのオブジェクトストレージとともにICOSが加わったことになります。

ストレージクラスや料金体系については[[こちら]](https://www.ibm.com/cloud-computing/bluemix/ja/pricing-object-storage#s3api)を参照してください。

#ICOSのオーダー

IBM cloudポータルからのメニューパスは次の通りです。

[[IBM cloudコンソール]](https://console.ng.bluemix.net/)->[インフラストラクチャー]->[[オブジェクトストレージ]](https://control.bluemix.net/storage/objectstorage)

![ICOS-0.png](https://qiita-image-store.s3.amazonaws.com/0/50008/6e75915d-c728-9054-bdcb-ff3021edc473.png)

[オブジェクトストレージの注文]をクリックします。

![ICOS-2.png](https://qiita-image-store.s3.amazonaws.com/0/50008/00d13da2-1c5d-4500-fbbd-42cf14108f13.png)

料金体系が表示されます。画面下部にある[注文]をクリックしてオーダー完了です。
（従量課金ですので気にせずオーダーします。）

![ICOS-3.png](https://qiita-image-store.s3.amazonaws.com/0/50008/3a88e56b-03f5-2670-0fb1-77cc5cd41c93.png)

作成されたアカウントをクリックして、[資格情報の表示]をクリックします。
[ACCESS KEYS]の欄にある`アクセスキーID`、`秘密アクセス・キー`をメモします。
この情報は後述のアクセスツールで使用します。

![ICOS-4.png](https://qiita-image-store.s3.amazonaws.com/0/50008/8d65aa3e-305f-c523-8a50-71cc2f52273d.png)

# CLI(awscli)でのアクセス

awscliをインストールします。
>RHEL7での例です。 
>```
$ sudo yum install python2-pip
$ sudo pip install awscli 
```

アカウント情報を登録します。
先ほどメモした資格情報`アクセスキーID`、`秘密アクセス・キー`を入力します。
regionへは`us-geo`を入力します。
> 2017/09執筆時点では日本国内のリージョンはありません。最寄りのusとしてます。

```
$ aws configure
AWS Access Key ID []: ****************
AWS Secret Access Key []: [****************
Default region name []: us-geo
Default output format []: json
```

アクセス確認で`ls`参照コマンドを実行しました。
endpointはデフォルトでawsさんを参照してしまいますので、明示が必要です。

```
$ aws s3 ls --endpoint=https://s3-api.sjc-us-geo.objectstorage.service.softlayer.net
2017-08-31 04:42:26 my-bucket
```

## ICOSのエンドポイントとストレージクラス

[エンドポイント一覧](https://ibm-public-cos.github.io/crs-docs/endpoints)

[ストレージクラス] 
ストレージクラスはリージョンとクラスで示されます。
バケットを作る際に利用します。
 
|リージョン | Standard | Vault     | ColdVault   | Flex  | 
|--------- |-------- |---|----|----|----|
|us-geo   |us-standard|us-vault|us-cold |us-flex     |
|us-east  |us-east-standard |us-east-vault |us-east-cold |us-east-flex |
|us-south |us-south-standard |us-south-vault |us-south-cold |us-south-flex|
|eu-geo   |eu-standard |eu-vault |eu-cold |eu-flex |

ストレージクラスはバケットを作成する際に`--region`パラメタで指定してください。

```
$ aws s3 mb s3://my-vault --region=us-valut  --endpoint=https://s3-api.sjc-us-geo.objectstorage.service.softlayer.net
make_bucket: my-vault
```
その他の操作はaws s3と同様となります。

#Filesystem in Userspace(goofys)でマウントしてアクセス

[goofys](https://github.com/kahing/goofys)はs3fs同様にマウントするためのツールです。
s3fsより高速との噂と実績なので試してみました。

### goofysのインストール 
- golangパッケージをインストールし、goofysをビルドします。

> golangは1.7以上が必要ですが、RHEL7ではgolang v1.6.xが提供されているため、
> ディストリビューション外の goリポジトリから最新golangをインストールします。

```
$ sudo rpm --import https://mirror.go-repo.io/centos/RPM-GPG-KEY-GO-REPO
$ sudo curl -s https://mirror.go-repo.io/centos/go-repo.repo | tee /etc/yum.repos.d/go-repo.repo
$ sudo yum clean all
$ sudo yum install golang git fuse

GOホームディレクトリの作成

$ sudo mkdir /usr/local/go
$ sudo su -

# export GOPATH=/usr/local/go
# export PATH=$PATH:$GOPATH/bin
# go get github.com/kahing/goofys
# go install github.com/kahing/goofys

ビルドされていることを確認
# ls -l /usr/local/go/bin/goofys
-rwxr-xr-x. 1 root root 13915583  9月  7 03:53 /usr/local/go/bin/goofys

誰でも利用できるように/usr/local/binへsymlinkを作成
# ln -sf /usr/local/go/bin/goofys  /usr/local/bin/goofys
# type goofys
goofys はハッシュされています (/usr/local/bin/goofys)
```

### マウントの仕方

手動でマウントする例は以下となります。

```
# goofys --endpoint=https://s3-api.sjc-us-geo.objectstorage.service.networklayer.com my-bucket /ext/icos

# df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/xvda2        25G  4.7G   19G   21% /
devtmpfs         1.9G     0  1.9G    0% /dev
tmpfs            1.8G     0  1.8G    0% /dev/shm
tmpfs            1.8G  8.4M  1.8G    1% /run
tmpfs            1.8G     0  1.8G    0% /sys/fs/cgroup
/dev/xvda1       240M  119M  109M   53% /boot
tmpfs            354M     0  354M    0% /run/user/0
my-bucket        1.0P     0  1.0P    0% /ext/icos <--１ペタで表示される。(※使用量は見えないです)
```

通常のファイル通り、findコマンドも利用できます。

```
# find /ext/icos -ls
     1    4 drwxr-xr-x   2 root     root         4096  9月  7 04:41 /ext/icos
     4 1488790 -rw-r--r--   1 root     root     1524520960  9月  7 02:39 /ext/icos/WATSON.tar
     5 3207610 -rw-r--r--   1 root     root     3284592640  9月  7 03:17 /ext/icos/plyabook.tar
#
```


### 自動マウントさせる場合(/etc/fstab)

fstabへ以下の様に記述します。

```
/usr/local/bin/goofys#my-bucket  /ext/icos   fuse  _netdev,--endpoint=https://s3-api.sjc-us-geo.objectstorage.service.networklayer.com  0 0
```

mount 

```
#sudo mount /ext/icos 

# df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/xvda2        25G  4.7G   19G   21% /
devtmpfs         1.9G     0  1.9G    0% /dev
tmpfs            1.8G     0  1.8G    0% /dev/shm
tmpfs            1.8G  8.4M  1.8G    1% /run
tmpfs            1.8G     0  1.8G    0% /sys/fs/cgroup
/dev/xvda1       240M  119M  109M   53% /boot
tmpfs            354M     0  354M    0% /run/user/0
my-bucket        1.0P     0  1.0P    0% /ext/icos <--１ペタで表示される。(※使用量は見え
```
>注意 API endpointの不調や切り替えが発生した場合や、クライアント側の過負荷等に依存し、マウントが切れる可能性があるため、別途、監視や自動リカバリの実装が必要です。