IBM Cloud Object StorageにCLIでバックアップ・リストアしてみる

# やりたいこと
ローカルストレージにあるデータをサクッとオブジェクトストレージにバックアップ取りたい。
そして、もしローカルのデータを間違えて消したり、消えてしまったときにはICOSのデータを使ってリストアしたい。

# IBM Cloud Object Storage（ICOS)とは？
IBM Cloud上で提供しているオブジェクトストレージです。
AWSのs3互換のためs3 cliやs3fsなどが使えます。
サービス内容や料金に関しては、以下サイトを確認ください。
https://console.bluemix.net/catalog/services/cloud-object-storage
https://www.ibm.com/cloud-computing/jp-ja/products/storage/object-storage/


# 今回の流れと前提条件

1. IBM CloudにログインしてIBM Cloud Object Storageを作成
2. アクセスするための資格情報の発行 　<**ここが一番ハマるとこ**
3. awscliでアクセス
4. バックアップ
5. リストア
6. まとめ
7. お片付け

* 前提条件
    * IBM Cloudのアカウントがあること
    * awscliが入ってること


# 1. IBM CloudにログインしてIBM Cloud Object Storageを作成
1. IBM Cloudにログインします
2. カタログ＞ストレージ＞[オブジェクトストレージ](https://console.bluemix.net/catalog/services/cloud-object-storage)の順に選択しサービスの詳細画面を開きます。
3. サービス名はそのままでOKで、価格プランから無料の**ライトプラン**を選択し作成します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/136580/9775f309-ad5d-8f0b-50b3-9ed677b6603d.png)


# 2. アクセスするための資格情報の発行
1. 作成が完了すると、ICOSの画面が表示されるので、左のメニューから**サービス資格情報**を選択
2. **新規資格情報**をクリック
3. **重要！**インラインの構成パラメーターの追加に `{"HMAC":true}` と入力する
4. 追加を行う
![image.png](https://qiita-image-store.s3.amazonaws.com/0/136580/aa7fc4fd-811d-5841-fbb5-7417fbfb1ff4.png)
5. access_key_id と secret_access_key をメモします。  
※３で行ったパラメーター追加を行わないとこのIDとKeyは表示されません！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/136580/e97713c6-d6c8-cdf1-9f11-d40256005a60.png)


# 3. awscliでアクセス。
1.aws configure を実行し先程メモしたIDとKEY、あと利用するICOSのリージョンを設定します  

* 今回はUSリージョンを利用します。  
* その他のリージョンに関しては[こちら](https://console.bluemix.net/docs/services/cloud-object-storage/cli/aws-cli.html#use-the-aws-cli)を確認ください。

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

2.AWSCLIのエンドポイントの設定

* 毎回打つのが面倒なので、今回は環境変数に設定しています。
* USリージョン以外のエンドポイントは[こちら](https://console.bluemix.net/docs/infrastructure/cloud-object-storage-infrastructure/endpoints.html#select-regions-and-endpoints)を確認ください。

```
$ export S3_ENDPOINT=https://s3-api.us-geo.objectstorage.softlayer.net
```

3.接続確認
まだbucketを作成していないので、空行が帰ってくると思いますが、エラーにならなければOKです

```
$ aws s3 ls --endpoint-url ${S3_ENDPOINT}
```

4.ICOSにbucketを作成し、確認

**重要!** bucket名はICOSのURLになるため**他のユーザー含め一意**になる名前を設定してください。

```
$ aws s3 mb s3://buckup-data --endpoint-url ${S3_ENDPOINT}
make_bucket: buckup-data

$ aws s3 ls --endpoint-url ${S3_ENDPOINT}
2018-09-06 16:19:39 buckup-data
```


# 4. バックアップ
バックアップ・リストアに利用するのはs3 sync コマンドです。
ソースとターゲットを指定することで、バックアップにも、リストアにも使えてます。
また、特定の拡張子のものだけsyncしたり、不要な重たいファイルを除外したりもできます。
`aws s3 sync <SOURCE> <TARGET>`

今回は、以下のフォルダを使ってバックアップ、リストアします

```
data
├── db.dump
└── visual-recognition
    └── TrainingImages
        ├── hdmi_male.zip
        ├── thunderbolt_male.zip
        ├── usb_male.zip
        └── vga_male.zip
```


1.バックアップの実行

```
$ aws s3 sync data s3://buckup-data/ --endpoint-url ${S3_ENDPOINT}
upload: data/.DS_Store to s3://buckup-data/.DS_Store
upload: data/visual-recognition/TrainingImages/hdmi_male.zip to s3://buckup-data/visual-recognition/TrainingImages/hdmi_male.zip
upload: data/visual-recognition/TrainingImages/usb_male.zip to s3://buckup-data/visual-recognition/TrainingImages/usb_male.zip
upload: data/visual-recognition/TrainingImages/thunderbolt_male.zip to s3://buckup-data/visual-recognition/TrainingImages/thunderbolt_male.zip
upload: data/visual-recognition/TrainingImages/vga_male.zip to s3://buckup-data/visual-recognition/TrainingImages/vga_male.zip
upload: data/db.dump to s3://buckup-data/db.dump
```

2.Upできたか確認

```
$ aws s3 ls s3://data-buckup/ --endpoint-url ${S3_ENDPOINT}
                           PRE visual-recognition/
2018-09-06 16:32:29    1270762 db.dump

$ aws s3 ls s3://buckup-data/visual-recognition/TrainingImages/ --endpoint-url ${S3_ENDPOINT}
2018-09-06 16:32:27     897022 hdmi_male.zip
2018-09-06 16:32:28    1103811 thunderbolt_male.zip
2018-09-06 16:32:28    1071072 usb_male.zip
2018-09-06 16:32:28     599661 vga_male.zip
```

ちなみに、GUIでも確認してみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/136580/40776110-95b6-f142-ccd1-968d0744fb39.png)


# 5. リストア

Upしたデータをdata-restoreフォルダにリストアしてみます。
syncコマンドのSOURCEとTARGETを入れ替えてコマンドを実行します。

```
$  aws s3 sync s3://buckup-data/ data2 --endpoint-url ${S3_ENDPOINT}
download: s3://buckup-data/.DS_Store to data2/.DS_Store
download: s3://buckup-data/visual-recognition/TrainingImages/vga_male.zip to data2/visual-recognition/TrainingImages/vga_male.zip
download: s3://buckup-data/visual-recognition/TrainingImages/hdmi_male.zip to data2/visual-recognition/TrainingImages/hdmi_male.zip
download: s3://buckup-data/db.dump to data2/db.dump
download: s3://buckup-data/visual-recognition/TrainingImages/thunderbolt_male.zip to data2/visual-recognition/TrainingImages/thunderbolt_male.zip
download: s3://buckup-data/visual-recognition/TrainingImages/usb_male.zip to data2/visual-recognition/TrainingImages/usb_male.zip
```

# 6. まとめ
かなり簡単にObjectStorageにデータをSyncできました。
一番の難関はやはり資格情報を発行する際のオプション指定！
aws s3 にIDやKEYを設定したあとは、s3コマンドを実行するだけなのでsync以外にもいろいろとできるので試してみてください

s3 — AWS CLI 1.16.8 Command Reference
https://docs.aws.amazon.com/cli/latest/reference/s3/index.html

# 7. お片付け
IBM Cloudの[ダッシュボード](https://console.bluemix.net/dashboard/apps)よりサービスの削除する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/136580/4d376255-fd83-a032-ca07-e2b39bed6180.png)


# 参考情報
* IBM Cloud Object Storageを使ってみた - Qiita
  https://qiita.com/satorubz/items/eba9bf9909b158a5d73c
* ICOS(IBM Cloud Object Storage)のaccess_key_idとsecret_access_keyが見つからない件 - Qiita
https://qiita.com/osonoi/items/81f52f57ded3e8aac82d
* IBM Cloud Docs
https://console.bluemix.net/docs/services/cloud-object-storage/about-cos.html
* s3 — AWS CLI 1.16.8 Command Reference
https://docs.aws.amazon.com/cli/latest/reference/s3/index.html