IBM Cloud Object Storage のデータを Swift API コンテナ から S3 API バケットに移行する


# 構成
以下のような構成で、「rclone」というプログラムを使ってデータをコピーしてみます。
今回は「rclone」を使うための Linux サーバーを IBM Cloud 上に用意しました。

**IBM Cloud Object Storage では、Swift と S3 に関わらず、Private Endpoint を提供しています。**
**Private 経由では、ネットワーク通信量に対する課金は発生しない** ので、安心してください。

![Kobito.KuynTq.png](https://qiita-image-store.s3.amazonaws.com/0/101361/28feec4c-19a3-c603-0fa1-ea0a9cb9f6a0.png "Kobito.KuynTq.png")


Swift API と S3 API の違いは下記リンクを参照してください。
>https://console.bluemix.net/catalog/infrastructure/object-storage-group


# 認証情報の取得
接続に使う認証情報をポータルから取得しておきましょう。

## Swift API
以下の3つの情報を使います。

- Private Endpoint
- Username
- API Key (Password)

![Kobito.L4gLlH.png](https://qiita-image-store.s3.amazonaws.com/0/101361/1a613148-d3e1-0b8a-e2b3-333b3ce83497.png "Kobito.L4gLlH.png")
<img src ="https://qiita-image-store.s3.amazonaws.com/0/101361/7f8be76f-fd2d-c93a-db1a-64e51eb60ac2.png" width=31%><img src ="https://qiita-image-store.s3.amazonaws.com/0/101361/2facd129-716e-45ae-a24b-cd8c694db07f.png" width=69%>


## S3 API
以下の3つの情報を使います。

- Private Endpoint
- Access Key ID
- Secret Access Key

![Kobito.34lupx.png](https://qiita-image-store.s3.amazonaws.com/0/101361/94266673-25bf-1625-4037-c664da18d769.png "Kobito.34lupx.png")
![Kobito.ISm1Dr.png](https://qiita-image-store.s3.amazonaws.com/0/101361/813077c7-4bf6-97bf-b4a7-d01025f5be11.png "Kobito.ISm1Dr.png")

![Kobito.Seo6rX.png](https://qiita-image-store.s3.amazonaws.com/0/101361/492459b1-6fe1-5075-9417-fc03da70fcc5.png "Kobito.Seo6rX.png")


# rclone を Linux サーバーにインストール
「unzip」等がないと、「None of the supported tools for extracting zip archives (unzip 7z) were found. Please install one of them and try again.」と怒られるので、入れておきます。
「rclone」のインストール自体は、2行目のコマンドだけなので非常に簡単です。

```
yum install unzip -y
curl https://rclone.org/install.sh | sudo bash
```
>https://rclone.org/install/

# rclone の設定

```rclone config``` のコマンドで設定ファイルを生成できるので、そこから適当なファイルをつくります。

設定ファイルは ```~/.config/rclone.conf``` に保存されるので、以下の設定として書き直します。

- 使いたいリージョンによって、適宜 Endpoint を変更します
- S3 API の設定では、Endpointの設定に加えて「region = other-v4-signature」とします
- S3 API の設定では、「location_constraint」のパラメータで以下の場所を指定します（https://rclone.org/s3/)
	- us-standard / us-vault / us-cold / us-flex 
	- us-east-standard / us-east-vault / us-east-cold / us-east-flex 
	- us-south-standard / us-south-vault / us-south-cold / us-south-flex 
	- eu-standard / eu-vault / eu-cold / eu-flex
	- ap-standard / ap-vault / ap-cold / ap-flex


```:~/.config/rclone.conf
[SWIFT]
type = swift
env_auth = false
user = IBMxxxxxx:xxxxxx
key = xxxxxx
auth = https://tok02.objectstorage.service.networklayer.com/auth/v1.0/
user_id = 
domain = 
tenant = 
tenant_id = 
tenant_domain = 
region = 
storage_url = 
auth_token = 
endpoint_type = private

[COS-TOK-AP]
type = s3
env_auth = false
access_key_id = xxxxxx
secret_access_key = xxxxxx
region = other-v4-signature
endpoint = s3.tok-ap-geo.objectstorage.service.networklayer.com
location_constraint = ap-flex
acl = private
server_side_encryption = 
storage_class = 
```

#設定確認
以下のコマンドで、コンテナやバケットのリストが出てくれば、問題なく設定されてることが確認できます。

```
rclone lsd SWIFT:
rclone lsd COS-TOK-AP:
```

```
[root@khayama-test rclone]# rclone lsd COS-TOK-AP:
          -1 2017-08-09 06:50:19        -1 apictest
          -1 2018-03-22 12:58:23        -1 khayama-test2
          -1 2018-03-28 13:09:53        -1 khayama-test3
```

#ドライラン
以下のコマンドで、どのファイルがコピーされる対象となっているか、確認できます。
**コピー先となる S3 API 側のバケットを新規に作る場合は、バケット名が全ユーザーの中で一意である必要ありますので、注意します。**

```
rclone --dry-run copy SWIFT:khayama COS-TOK-AP:khayama-test4
```

```
[root@khayama-test rclone]# rclone --dry-run copy SWIFT:khayama COS-TOK-AP:khayama-test4
2018/04/03 03:49:58 NOTICE: vyatta-vrouter-5.2R5S3_B_amd64.iso: Not copying as --dry-run
```

# オブジェクトストレージ間のコピー
以下のコマンドで実施できます。

```
rclone -v copy SWIFT:khayama COS-TOK-AP:khayama-test4
```

100 Mbps の Linux サーバーで実行した場合、これくらいの速度感でした。

```
[root@khayama-test rclone]# rclone -v copy SWIFT:khayama COS-TOK-AP:khayama-test4
2018/04/03 04:09:49 INFO  : S3 bucket khayama-test4: Modify window is 1ns
2018/04/03 04:09:50 INFO  : S3 bucket khayama-test4: Waiting for checks to finish
2018/04/03 04:09:50 INFO  : S3 bucket khayama-test4: Waiting for transfers to finish
2018/04/03 04:10:26 INFO  : vyatta-vrouter-5.2R5S3_B_amd64.iso: Copied (new)
2018/04/03 04:10:26 INFO  : 
Transferred:   335 MBytes (9.108 MBytes/s)
Errors:                 0
Checks:                 0
Transferred:            1
Elapsed time:       36.7s
```

このコマンドでは、ファイルはコピーされるだけで、削除はされません。

![Kobito.M3OwGE.png](https://qiita-image-store.s3.amazonaws.com/0/101361/863e1f31-f821-6211-5ae3-cfed3e20258f.png "Kobito.M3OwGE.png")

ターゲット側の S3 API の設定で「location_constraint」のパラメータを「ap-standard / ap-vault / ap-cold / ap-flex」の中で変えてみると、反映されていることがわかります。

![Kobito.iCI0a7.png](https://qiita-image-store.s3.amazonaws.com/0/101361/a3f3ae96-da6c-9461-4d60-d92b73c58e9a.png "Kobito.iCI0a7.png")

#さいごに
「rclone」は「rsync」のようなコマンドが使え、たとえばオブジェクトストレージ間のデータ同期、ローカルPC-オブジェクトストレージ間のデータ同期にも有効です。
ぜひ使ってみてください。