IBM Cloud Object Storage(ICOS)でrcloneを使用してファイルの同期処理を実行する

# 概要
当記事では、[rclone](https://rclone.org/)というクラウドストレージを対象としたコマンドラインのファイル管理ツールを使用し、IBM Cloud Object Storage（ICOS）に対してファイル同期処理を実行する手順を紹介します。


# 前提事項
当記事の前提バージョン・環境は以下となります。

- rclone：1.58
- OS：Ubuntu 20.04.3 LTS
- サーバ：IBM Cloud VPCの仮想サーバ（VSI）

また、ICOSのインスタンスは作成済みとします。


# 事前準備
rcloneでICOSにアクセスするために、HMAC認証で使用する「アクセスキーID」、「シークレットアクセスキー」が必要となります。この２つを生成・確認する手順を別記事「[IBM Cloud Object Storage(ICOS)で、Amazon S3互換ツールでのアクセス（HMAC認証）を有効にする](https://qiita.com/hisato_imanishi/items/57e64c415b65a1944518)」にまとめています。こちらを参照し、「アクセスキーID」、「シークレットアクセスキー」を取得してください。


# rcloneの導入
sudoが実行可能な任意のユーザで以下のコマンドを実行します。

```bash
curl https://rclone.org/install.sh | sudo bash
```


# rcloneの設定
rcloneコマンドを実行して同期処理を行うユーザで`rclone config`コマンドを実行し、対話的に設定を進めていきます。このコマンドで設定した内容は、`/home/<ユーザID>/.config/rclone/rclone.conf`ファイルに反映されます。

`rclone config`により以下のダイアログが出てきますので、それぞれ選択・入力していきます。

「n」(New remote)を選択します。
```
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
```

設定の名前を聞かれるので入力します。この設定名は、今後rcloneコマンドを実行する際に毎回含めるため、分かりやすい名前がよいです。
```
name> <任意の設定名>
```


ストレージの種類を選択します。今回、Amazon S3互換のストレージとしてICOSを使用するため、以下のコマンド例に記載の選択肢を選択します。なお、選択肢の番号はrcloneのバージョンによって異なるため、選択肢の内容を見て適切な番号を入力ください。
```
Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.

(中略)
5 / Amazon S3 Compliant Storage Providers including AWS, Alibaba, Ceph, China Mobile, Digital Ocean, Dreamhost, IBM COS, Lyve Cloud, Minio, Netease, RackCorp, Scaleway, SeaweedFS, StackPath, Storj, Tencent COS and Wasabi
(中略)
```


ストレージプロバイダーとして、「IBM COS S3」を選択します。
```
Option provider.
Choose your S3 provider.
Choose a number from below, or type in your own value.
Press Enter to leave empty.

(中略)
 7 / IBM COS S3
(中略)
```

認証情報を直接入力するため、「1 / Enter AWS credentials in the next step.」を選択します。
```
Option env_auth.
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
Only applies if access_key_id and secret_access_key is blank.
Choose a number from below, or type in your own boolean value (true or false).
Press Enter for the default (false).

1 / Enter AWS credentials in the next step.
   \ (false)
2 / Get AWS credentials from the environment (env vars or IAM).
   \ (true)
```


事前準備で取得した「アクセスキーID」を入力します。
```
Option access_key_id.
AWS Access Key ID.
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.

access_key_id>
```

事前準備で取得した「シークレットアクセスキー」を入力します。
```
Option secret_access_key.
AWS Secret Access Key (password).
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.

secret_access_key>
```

S3クローンであるICOSを使用するため、ここでは何も入力せずにEnterキーを押します。
```
Option region.
Region to connect to.
Leave blank if you are using an S3 clone and you don't have a region.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
   / Use this if unsure.
 1 | Will use v4 signatures and an empty region.
   \ ()

   / Use this only if v4 signatures don't work.
 2 | E.g. pre Jewel/v10 CEPH.
   \ (other-v2-signature)
```

ICOSのエンドポイントを選択、または、直接入力します。ICOSのエンドポイントは、ICOSのインスタンスのページの「エンドポイント」メニューで確認できます。rcloneの選択肢の中に該当するものがあればその番号を、該当するものが無ければエンドポイントのURLを直接入力します。今回は、IBM Cloudの東京リージョンのVPC内のサーバからICOSを利用したかったため、「ダイレクト」のエンドポイントを直接入力しました。
```
Option endpoint.
Endpoint for IBM COS S3 API.
Specify if using an IBM COS On Premise.
Choose a number from below, or type in your own string value.

endpoint> s3.direct.jp-tok.cloud-object-storage.appdomain.cloud
```

　【参考】 エンドポイント
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/fae09199-7df8-cade-d849-a698694c8a05.png)


ストレージのロケーションを選択します。ここでは「APAC Standard(ap-standard)」を選択します。
```
Option location_constraint.
Location constraint - must match endpoint when using IBM Cloud Public.
For on-prem COS, do not make a selection from this list, hit enter.
Choose a number from below, or type in your own value.
Press Enter to leave empty.

21 / APAC Standard
   \ (ap-standard)

location_constraint> 
```

ACLを選択します。権限を持ったユーザのみがアクセスできるように「1 private」を選択します。
```
Option acl.
Canned ACL used when creating buckets and storing or copying objects.
This ACL is used for creating objects and if bucket_acl isn't set, for creating buckets too.
For more info visit https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl
Note that this ACL is applied when server-side copying objects as S3
doesn't copy the ACL from the source but rather writes a fresh one.
Choose a number from below, or type in your own value.

Press Enter to leave empty.

   / Owner gets FULL_CONTROL.
 1 | No one else has access rights (default).
   | This acl is available on IBM Cloud (Infra), IBM Cloud (Storage), On-Premise COS.
   \ (private)

   / Owner gets FULL_CONTROL.
 2 | The AllUsers group gets READ access.
   | This acl is available on IBM Cloud (Infra), IBM Cloud (Storage), On-Premise IBM COS.
   \ (public-read)
   / Owner gets FULL_CONTROL.

 3 | The AllUsers group gets READ and WRITE access.
   | This acl is available on IBM Cloud (Infra), On-Premise IBM COS.
   \ (public-read-write)

   / Owner gets FULL_CONTROL.
   | The AuthenticatedUsers group gets READ access.
 4 | Not supported on Buckets.
   | This acl is available on IBM Cloud (Infra) and On-Premise IBM COS.
   \ (authenticated-read)

acl> 
```


追加設定に関して、「n」(No (default))を選択します。
```
Edit advanced config?
y) Yes
n) No (default)

y/n>
```


最終的な設定内容が表示されるため、その内容を確認し、「y」(Yes this is OK (default)) を選択します。

```
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote

y/e/d>
```


# rcloneの実行

以下のコマンドを実行し、ICOSのバケットを表示することで、ICOSにアクセスできることを確認します。末尾の「:」は必要ですのでご注意ください。
```bash
# コマンド
rclone lsd <rclone configで入力した設定名>:

# 実行例
rclone lsd rclone-test:
```

`rclone sync`を実行することで、ローカルとICOSのファイルを同期させることができます。ICOSにあり、ローカルには無いファイルは削除されますのでご注意ください。具体的には以下のように実行します。

```bash
# コマンド
rclone sync <ローカルのディレクトリ> <rclone configで入力した設定名>:<ICOSのバケット名>

# 実行例
rclone sync /tmp/rclone-sample/ rclone-test:rclone-bucket-sample
```

以上です。