IBM Cloud: IBM Cloud Object Storage(ICOS)のレプリケーション機能を試してみた

# 1. はじめに
2022年6月21日に、ICOSのレプリケーション機能が提供開始されました。
https://cloud.ibm.com/docs/cloud-object-storage?topic=cloud-object-storage-replication-overview&locale=en

以下に主な特徴を記載します。

- bucket間の非同期レプリケーション。
- レプリケーション先は、同一ロケーションのbucketでもいいし、異なるロケーションのbucketでも良い。
- レプリケーション先は、異なるResiliencyでもよい（例：Cross Region ICOSからRegional ICOSへのレプリケーションなど）
- レプリケーション先は、異なるストレージポリシー（Smart Tier/Standard/Vault/Cold Vault)でも良い。
- レプリケーション先は、異なるアカウントでも良い。
- メタデータ（objectの作成日など）もレプリケーションの対象。
- 双方向のレプリケーションも可能。
- フィルター（prefixもしくはタグを利用）を設定して、特定の条件に適合したobjectだけをレプリケーション対象にすることも可能。
- レプリケーションに伴うAPI呼び出し(`PUT`, `GET`, `HEAD`)に対しては課金されるが、データ転送量については課金対象外。


実際に利用する上でハマりそうなのは以下の箇所です。その他条件はdocsを参照してください。
- bucket内では複数のreplication ruleを作成することが可能だが、1つのobjectに対して、条件に該当する最優先のruleしか利用されない。つまり、1つのobjectを複数のbucketにレプリケーションすることはできない。なお、bucketA -> bucketBとbucketB->bucketCというruleを作っても、bucketAに作成したobjectはbucketBにはレプリケーションされるが、bucketCにはレプリケーションされない。
- レプリケーションの設定をした後に作成されたobjectにしかレプリケーション対象にならない。ただし、既存のobjectに対しては自分自身にコピー（新しいバージョンを作成）する操作を実施して新たにバージョンを生成することで、レプリケーション対象にすることが可能。
- source/destinationの両方のbucketでversioningを有効にしておく必要がある。特に、retention policy(Immutable Objectの構成)を利用しているとversioningは利用できないことにも注意。retention policyは一度作成してしまうと削除することはできないので、そのbucketはレプリケーション対象にすることはできない。
    - https://cloud.ibm.com/docs/cloud-object-storage?topic=cloud-object-storage-versioning#versioning-worm
    - https://cloud.ibm.com/docs/cloud-object-storage?topic=cloud-object-storage-replication-overview#replication-interactions-worm
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/5e6bffd5-ffb1-f2f6-7d4d-75eff82ddb9f.png)
- Legacy Firewallを利用してはいけない。Context-based restrictionでのFirewall利用は可能。
- アーカイブ状態のobjectはレプリケーションされない。
- 以下の権限が必要
    - ユーザー権限: source bucketに対する`cloud-object-storage.bucket.put_replication`が含まれるロールの割り当てが必要。デフォルトで用意されているロールとしては、`Writer`もしくは`Manager`であればこの権限が含まれている。別途カスタムロールを作っても良い。
    - source bucketがdesitination bucketに書き込むことを許可する権限: CLI（source/destinationが同一アカウントのみサポート）やAPIからも構成できるが、`https://cloud.ibm.com/iam/authorizations`から設定もできる。以下は、自アカウントのインスタンス内のbucketから、同一インスタンスへのbucket書き込みを許可する構成の例。<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/a0192860-d79b-1bc0-1b78-304ee3197056.png)



# 2. 設定方法

source bucket/destination bucketでの`Versioning`設定や、`権限の付与`はあらかじめ実施しておくものとする。

- Source bucketのConfiguration内にある、`Bucket replication rules`にて、`Setup replication`を押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/83cf7608-9119-3737-bc17-7d5ca1869825.png)
- `Replication source`を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/febed2cc-07fd-2a75-9f38-0cfce4fcc360.png)
- `Destination bucket`を指定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/feac4047-ced9-c6ee-cba3-8fe5c0944203.png)
- 権限が正しく構成されているので、Permissionの警告なしに以下の画面に遷移する（もし権限が足りていない場合は、ここで権限を付与する旨の指示画面が表示される）。全データをコピーしたい場合は、Prefix Filterを構成する必要はない。もし何かしらのフィルターを設けてレプリケーションルールを構成したい場合はPrefix filterを構成する。Rule nameは設定することを推奨。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/47af8e2a-3a29-97ff-278e-7c9c167eb8a6.png)


# 3. テスト


## テスト1: レプリケーション設定直後の状態

- `mybucket106(jp-tok)` -> `mybucket102(jp-tok)`のレプリケーションを構成。
- source bucket/destination bucket共にデータは存在しているが、設定直後では同期されていない。

```txt:source側bucket
$ ibmcloud cos objects --bucket mybucket106
OK
Found 6 objects in bucket 'mybucket106':

Name                                                                                                                                                Last Modified              Object Size
Veeam/                                                                                                                                              Jun 20, 2020 at 07:00:17   0 B
Veeam/Archive/                                                                                                                                      Jun 20, 2020 at 07:00:18   0 B
Veeam/Archive/backup/                                                                                                                               Jun 20, 2020 at 07:00:19   0 B
result/jobid=ad8adbd5-bd6e-4c96-a954-efabfb0fa874                                                                                                   Mar 25, 2020 at 07:15:03   0 B
result/jobid=ad8adbd5-bd6e-4c96-a954-efabfb0fa874/_SUCCESS                                                                                          Mar 25, 2020 at 07:15:08   0 B
result/jobid=ad8adbd5-bd6e-4c96-a954-efabfb0fa874/part-00000-7b2aff6b-68d3-404e-9588-549b0f964acd-c000-attempt_20200325071505_0005_m_000000_0.csv   Mar 25, 2020 at 07:15:06   30.84 KiB
```

```txt:destination側bucket
$ ibmcloud cos objects --bucket mybucket102
OK
Found 8 objects in bucket 'mybucket102':

Name                    Last Modified              Object Size
404_not_found.png       Apr 01, 2022 at 00:15:11   408.46 KiB
error.html              Oct 28, 2020 at 04:32:32   195 B
favicon.ico             Oct 28, 2020 at 04:21:36   63.71 KiB
index.html              Mar 31, 2022 at 23:31:10   284 B
ninja.jpg               Oct 28, 2020 at 04:16:09   23.67 KiB
ojigi_animal_neko.png   Mar 31, 2022 at 06:23:49   348.42 KiB
sorry.html              Apr 01, 2022 at 02:48:01   423 B
style.css               Oct 28, 2020 at 04:16:12   110 B
```


## テスト2: source側bucketに新規にデータを追加

- テスト1の状態から、source側にtestdata1.txt, testdata2.txt, testdata3.txtを追加。
- source側に新たに追加されたデータのみがレプリケーションされている。

```txt:source側bucket
$ ibmcloud cos objects --bucket mybucket106
OK
Found 9 objects in bucket 'mybucket106':

Name                                                                                                                                                Last Modified              Object Size
Veeam/                                                                                                                                              Jun 20, 2020 at 07:00:17   0 B
Veeam/Archive/                                                                                                                                      Jun 20, 2020 at 07:00:18   0 B
Veeam/Archive/backup/                                                                                                                               Jun 20, 2020 at 07:00:19   0 B
result/jobid=ad8adbd5-bd6e-4c96-a954-efabfb0fa874                                                                                                   Mar 25, 2020 at 07:15:03   0 B
result/jobid=ad8adbd5-bd6e-4c96-a954-efabfb0fa874/_SUCCESS                                                                                          Mar 25, 2020 at 07:15:08   0 B
result/jobid=ad8adbd5-bd6e-4c96-a954-efabfb0fa874/part-00000-7b2aff6b-68d3-404e-9588-549b0f964acd-c000-attempt_20200325071505_0005_m_000000_0.csv   Mar 25, 2020 at 07:15:06   30.84 KiB
testdata1.txt                                                                                                                                       Jun 28, 2022 at 00:15:04   25.48 KiB
testdata2.txt                                                                                                                                       Jun 28, 2022 at 00:15:04   25.48 KiB
testdata3.txt                                                                                                                                       Jun 28, 2022 at 00:15:04   25.48 KiB
```


```txt:destination側bucket
$ ibmcloud cos objects --bucket mybucket102
OK
Found 11 objects in bucket 'mybucket102':

Name                    Last Modified              Object Size
404_not_found.png       Apr 01, 2022 at 00:15:11   408.46 KiB
error.html              Oct 28, 2020 at 04:32:32   195 B
favicon.ico             Oct 28, 2020 at 04:21:36   63.71 KiB
index.html              Mar 31, 2022 at 23:31:10   284 B
ninja.jpg               Oct 28, 2020 at 04:16:09   23.67 KiB
ojigi_animal_neko.png   Mar 31, 2022 at 06:23:49   348.42 KiB
sorry.html              Apr 01, 2022 at 02:48:01   423 B
style.css               Oct 28, 2020 at 04:16:12   110 B
testdata1.txt           Jun 28, 2022 at 00:15:04   25.48 KiB
testdata2.txt           Jun 28, 2022 at 00:15:04   25.48 KiB
testdata3.txt           Jun 28, 2022 at 00:15:04   25.48 KiB
```

## テスト3: source側bucketから追加したデータを削除

- テスト2の状態から、source側でtestdata2.txt, testdata3.txtを削除。
- ターゲット側からも削除されている。

```txt:source側bucket
$ ibmcloud cos objects --bucket mybucket106
OK
Found 7 objects in bucket 'mybucket106':

Name                                                                                                                                                Last Modified              Object Size
Veeam/                                                                                                                                              Jun 20, 2020 at 07:00:17   0 B
Veeam/Archive/                                                                                                                                      Jun 20, 2020 at 07:00:18   0 B
Veeam/Archive/backup/                                                                                                                               Jun 20, 2020 at 07:00:19   0 B
result/jobid=ad8adbd5-bd6e-4c96-a954-efabfb0fa874                                                                                                   Mar 25, 2020 at 07:15:03   0 B
result/jobid=ad8adbd5-bd6e-4c96-a954-efabfb0fa874/_SUCCESS                                                                                          Mar 25, 2020 at 07:15:08   0 B
result/jobid=ad8adbd5-bd6e-4c96-a954-efabfb0fa874/part-00000-7b2aff6b-68d3-404e-9588-549b0f964acd-c000-attempt_20200325071505_0005_m_000000_0.csv   Mar 25, 2020 at 07:15:06   30.84 KiB
testdata1.txt                                                                                                                                       Jun 28, 2022 at 00:15:04   25.48 KiB

```
```txt:destination側bucket
$ ibmcloud cos objects --bucket mybucket102
OK
Found 9 objects in bucket 'mybucket102':

Name                    Last Modified              Object Size
404_not_found.png       Apr 01, 2022 at 00:15:11   408.46 KiB
error.html              Oct 28, 2020 at 04:32:32   195 B
favicon.ico             Oct 28, 2020 at 04:21:36   63.71 KiB
index.html              Mar 31, 2022 at 23:31:10   284 B
ninja.jpg               Oct 28, 2020 at 04:16:09   23.67 KiB
ojigi_animal_neko.png   Mar 31, 2022 at 06:23:49   348.42 KiB
sorry.html              Apr 01, 2022 at 02:48:01   423 B
style.css               Oct 28, 2020 at 04:16:12   110 B
testdata1.txt           Jun 28, 2022 at 00:15:04   25.48 KiB
```

念の為、この状態でバージョン情報も表示してみると、（実はこのテスト前に事前にファイルを作ったり消したりとかしてしまっていたのだが、）そういう過去のバージョン情報も含めて同期されていることがわかる。

```txt:source側bucket
$ ibmcloud cos object-versions --bucket mybucket106 --prefix testdata
OK
Found 7 object versions in bucket 'mybucket106':

Name            Version ID                             Last Modified              Object Size   Is Latest
testdata1.txt   00000181-a7a9-622f-e125-0c27fec420bf   Jun 28, 2022 at 00:15:04   25.48 KiB     true
testdata1.txt   00000181-a7a4-c9a4-fc5d-bf8c9d7bb5f8   Jun 28, 2022 at 00:10:03   25.48 KiB     false
testdata1.txt   00000181-a7a3-862f-3e9c-f630c579b6e4   Jun 28, 2022 at 00:08:40   25.48 KiB     false
testdata1.txt   00000181-a79b-439c-2324-e31d2dc1e122   Jun 27, 2022 at 23:59:39   25.48 KiB     false
testdata2.txt   00000181-a7a9-6169-31e2-3093ff6e995e   Jun 28, 2022 at 00:15:04   25.48 KiB     false
testdata2.txt   00000181-a7a5-6023-5b68-8e698bb184b2   Jun 28, 2022 at 00:10:42   25.48 KiB     false
testdata3.txt   00000181-a7a9-5f42-ad84-21e58622645a   Jun 28, 2022 at 00:15:04   25.48 KiB     false

Found 7 delete markers in bucket 'mybucket106':

Name            Version ID                             Last Modified              Is Latest
testdata1.txt   00000181-a7a5-ff35-0db3-52d42d20915f   Jun 28, 2022 at 00:11:22   false
testdata1.txt   00000181-a7a4-73bd-9fd9-6879565c66a7   Jun 28, 2022 at 00:09:41   false
testdata1.txt   00000181-a79e-bd55-7a39-cf4efd178446   Jun 28, 2022 at 00:03:27   false
testdata1.txt   00000181-a79b-92bf-49d6-b7b6ab05588f   Jun 27, 2022 at 23:59:59   false
testdata2.txt   00000181-a7aa-830f-d84c-89f08e681827   Jun 28, 2022 at 00:16:18   true
testdata2.txt   00000181-a7a5-9870-8025-7e13d5d05ce4   Jun 28, 2022 at 00:10:56   false
testdata3.txt   00000181-a7aa-7549-8615-68094ade4f68   Jun 28, 2022 at 00:16:15   true
```
```txt:destination側bucket
$ ibmcloud cos object-versions --bucket mybucket102 --prefix testdata
OK
Found 7 object versions in bucket 'mybucket102':

Name            Version ID                             Last Modified              Object Size   Is Latest
testdata1.txt   00000181-a7a9-622f-e125-0c27fec420bf   Jun 28, 2022 at 00:15:04   25.48 KiB     true
testdata1.txt   00000181-a7a4-c9a4-fc5d-bf8c9d7bb5f8   Jun 28, 2022 at 00:10:03   25.48 KiB     false
testdata1.txt   00000181-a7a3-862f-3e9c-f630c579b6e4   Jun 28, 2022 at 00:08:40   25.48 KiB     false
testdata1.txt   00000181-a79b-439c-2324-e31d2dc1e122   Jun 27, 2022 at 23:59:39   25.48 KiB     false
testdata2.txt   00000181-a7a9-6169-31e2-3093ff6e995e   Jun 28, 2022 at 00:15:04   25.48 KiB     false
testdata2.txt   00000181-a7a5-6023-5b68-8e698bb184b2   Jun 28, 2022 at 00:10:42   25.48 KiB     false
testdata3.txt   00000181-a7a9-5f42-ad84-21e58622645a   Jun 28, 2022 at 00:15:04   25.48 KiB     false

Found 8 delete markers in bucket 'mybucket102':

Name            Version ID                             Last Modified              Is Latest
testdata1.txt   00000181-a7a5-ff35-0db3-52d42d20915f   Jun 28, 2022 at 00:11:22   false
testdata1.txt   00000181-a7a4-73bd-9fd9-6879565c66a7   Jun 28, 2022 at 00:09:41   false
testdata1.txt   00000181-a79e-bd55-7a39-cf4efd178446   Jun 28, 2022 at 00:03:27   false
testdata1.txt   00000181-a79b-cd0c-870d-e7adf33f7882   Jun 28, 2022 at 00:00:14   false
testdata1.txt   00000181-a79b-92bf-49d6-b7b6ab05588f   Jun 27, 2022 at 23:59:59   false
testdata2.txt   00000181-a7aa-830f-d84c-89f08e681827   Jun 28, 2022 at 00:16:18   true
testdata2.txt   00000181-a7a5-9870-8025-7e13d5d05ce4   Jun 28, 2022 at 00:10:56   false
testdata3.txt   00000181-a7aa-7549-8615-68094ade4f68   Jun 28, 2022 at 00:16:15   true
```

## テスト4: さらにreplication先のbucketを増やししてみた

- テスト3の状態から、`mybucket106(jp-tok)` -> `mybucket102(jp-tok)`のレプリケーションルールだけでなく、`mybucket106(jp-tok)` -> `mybucket103(us-south)`のレプリケーションルールも追加した。<br> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/76e2f249-9e5c-3ae2-bf57-48323effcac4.png)
- この状態で、新たにtestdata4.txt, testdata5.txtというデータをsource側に追加したが、既存のdestinationには同期されず、新規に作成したdestinationにしかデータは同期されていない。これは、新規に追加したbucketへのレプリケーションの方が優先度が高いためである。[IBM Cloud docs](https://cloud.ibm.com/docs/cloud-object-storage?topic=cloud-object-storage-replication-overview&locale=en)には以下のような記載がある。

>The priority indicates which rule has precedence whenever two or more replication rules conflict. Object storage will attempt to replicate objects according to all replication rules. However, if there are two or more rules with the same destination bucket, then objects will be replicated according to the rule with the highest priority. The higher the number, the higher the priority.


```txt:source側bucket
$ ibmcloud cos objects --bucket mybucket106
OK
Found 9 objects in bucket 'mybucket106':

Name                                                                                                                                                Last Modified              Object Size
Veeam/                                                                                                                                              Jun 20, 2020 at 07:00:17   0 B
Veeam/Archive/                                                                                                                                      Jun 20, 2020 at 07:00:18   0 B
Veeam/Archive/backup/                                                                                                                               Jun 20, 2020 at 07:00:19   0 B
result/jobid=ad8adbd5-bd6e-4c96-a954-efabfb0fa874                                                                                                   Mar 25, 2020 at 07:15:03   0 B
result/jobid=ad8adbd5-bd6e-4c96-a954-efabfb0fa874/_SUCCESS                                                                                          Mar 25, 2020 at 07:15:08   0 B
result/jobid=ad8adbd5-bd6e-4c96-a954-efabfb0fa874/part-00000-7b2aff6b-68d3-404e-9588-549b0f964acd-c000-attempt_20200325071505_0005_m_000000_0.csv   Mar 25, 2020 at 07:15:06   30.84 KiB
testdata1.txt                                                                                                                                       Jun 28, 2022 at 00:15:04   25.48 KiB
testdata4.txt                                                                                                                                       Jun 28, 2022 at 00:31:58   25.48 KiB
testdata5.txt                                                                                                                                       Jun 28, 2022 at 00:34:43   25.48 KiB
```
```txt:destination側bucket（priority=0)
$ ibmcloud cos objects --bucket mybucket102
OK
Found 9 objects in bucket 'mybucket102':

Name                    Last Modified              Object Size
404_not_found.png       Apr 01, 2022 at 00:15:11   408.46 KiB
error.html              Oct 28, 2020 at 04:32:32   195 B
favicon.ico             Oct 28, 2020 at 04:21:36   63.71 KiB
index.html              Mar 31, 2022 at 23:31:10   284 B
ninja.jpg               Oct 28, 2020 at 04:16:09   23.67 KiB
ojigi_animal_neko.png   Mar 31, 2022 at 06:23:49   348.42 KiB
sorry.html              Apr 01, 2022 at 02:48:01   423 B
style.css               Oct 28, 2020 at 04:16:12   110 B
testdata1.txt           Jun 28, 2022 at 00:15:04   25.48 KiB
```

```txt:destination側bucket（priority=1)
$ ibmcloud target -r us-south
$ ibmcloud cos objects --bucket mybucket103
OK
Found 2 objects in bucket 'mybucket103':

Name            Last Modified              Object Size
testdata4.txt   Jun 28, 2022 at 00:31:58   25.48 KiB
testdata5.txt   Jun 28, 2022 at 00:34:43   25.48 KiB
```


## テスト5: 2つルールを作成し、一方にフィルターを作成した

- テスト4の状態で、priorityの高いruleに`backup`というprefix filterを持つフィルターを作成した。
- これにより、フィルタールールに適合するobjectは`priority=1`のbucketにレプリケーションされ、それ以外のobjectは`priority=0`のbucketにレプリケーションされるはずである。
- source側bucketにtestdata6.txtと、backup/testdata7.txtというファイルを追加したところ。testdata6.txtはフィルタールールに適合しないため`priority=0`にレプリケーションされ、backup/testdata7.txtはフィルタールールに適合して`priority=1`のbucketにレプリケーションされた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/dfbf0766-996a-cf9e-8fa8-3c27a15eb3a9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/0a32ee67-1cc7-248b-1314-1496afb4d4da.png)


```txt:source側bucket
$ ibmcloud cos objects --bucket mybucket106
OK
Found 11 objects in bucket 'mybucket106':

Name                                                                                                                                                Last Modified              Object Size
Veeam/                                                                                                                                              Jun 20, 2020 at 07:00:17   0 B
Veeam/Archive/                                                                                                                                      Jun 20, 2020 at 07:00:18   0 B
Veeam/Archive/backup/                                                                                                                               Jun 20, 2020 at 07:00:19   0 B
backup/testdata7.txt                                                                                                                                Jul 04, 2022 at 02:54:40   25.48 KiB
result/jobid=ad8adbd5-bd6e-4c96-a954-efabfb0fa874                                                                                                   Mar 25, 2020 at 07:15:03   0 B
result/jobid=ad8adbd5-bd6e-4c96-a954-efabfb0fa874/_SUCCESS                                                                                          Mar 25, 2020 at 07:15:08   0 B
result/jobid=ad8adbd5-bd6e-4c96-a954-efabfb0fa874/part-00000-7b2aff6b-68d3-404e-9588-549b0f964acd-c000-attempt_20200325071505_0005_m_000000_0.csv   Mar 25, 2020 at 07:15:06   30.84 KiB
testdata1.txt                                                                                                                                       Jun 28, 2022 at 00:15:04   25.48 KiB
testdata4.txt                                                                                                                                       Jun 28, 2022 at 00:31:58   25.48 KiB
testdata5.txt                                                                                                                                       Jun 28, 2022 at 00:34:43   25.48 KiB
testdata6.txt                                                                                                                                       Jul 04, 2022 at 02:50:39   25.48 KiB
```
```txt:destination側bucket(priority=0)
$ ibmcloud cos objects --bucket mybucket102
OK
Found 10 objects in bucket 'mybucket102':

Name                    Last Modified              Object Size
404_not_found.png       Apr 01, 2022 at 00:15:11   408.46 KiB
error.html              Oct 28, 2020 at 04:32:32   195 B
favicon.ico             Oct 28, 2020 at 04:21:36   63.71 KiB
index.html              Mar 31, 2022 at 23:31:10   284 B
ninja.jpg               Oct 28, 2020 at 04:16:09   23.67 KiB
ojigi_animal_neko.png   Mar 31, 2022 at 06:23:49   348.42 KiB
sorry.html              Apr 01, 2022 at 02:48:01   423 B
style.css               Oct 28, 2020 at 04:16:12   110 B
testdata1.txt           Jun 28, 2022 at 00:15:04   25.48 KiB
testdata6.txt           Jul 04, 2022 at 02:50:39   25.48 KiB
```
```txt:destination側bucket(priority=1)
$ ibmcloud cos objects --bucket mybucket103
OK
Found 3 objects in bucket 'mybucket103':

Name                   Last Modified              Object Size
backup/testdata7.txt   Jul 04, 2022 at 02:54:40   25.48 KiB
testdata4.txt          Jun 28, 2022 at 00:31:58   25.48 KiB
testdata5.txt          Jun 28, 2022 at 00:34:43   25.48 KiB
```

## テスト6: レプリケーションを数珠繋ぎにする。

既存の

- mybucket106(jp-tok) -> mybucket102(jp-tok)
- mybucket106(jp-tok) -> mybucket103(us-south)

に加えて、

- mybucket102(jp-tok) -> mybucket103(us-south)

のルールも追記して、mybucket106(jp-tok) -> mybucket102(jp-tok) -> mybucket103(us-south)という数珠繋ぎの構成にしてみた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/d7706755-a6a7-2ab1-47ad-515441e544ef.png)

しかし、testdata8.txtというデータをsource側に追加したが、1つ目のbucket(`mybucket102`)まではレプリケーションされたが、その後続のbucket(`mybucket106`)にはレプリケーションされなかった（現時点ではそういう仕様とのこと）。


```txt:source側bucket
$ ibmcloud cos objects --bucket mybucket106
OK
Found 12 objects in bucket 'mybucket106':

Name                                                                                                                                                Last Modified              Object Size
Veeam/                                                                                                                                              Jun 20, 2020 at 07:00:17   0 B
Veeam/Archive/                                                                                                                                      Jun 20, 2020 at 07:00:18   0 B
Veeam/Archive/backup/                                                                                                                               Jun 20, 2020 at 07:00:19   0 B
backup/testdata7.txt                                                                                                                                Jul 04, 2022 at 02:54:40   25.48 KiB
result/jobid=ad8adbd5-bd6e-4c96-a954-efabfb0fa874                                                                                                   Mar 25, 2020 at 07:15:03   0 B
result/jobid=ad8adbd5-bd6e-4c96-a954-efabfb0fa874/_SUCCESS                                                                                          Mar 25, 2020 at 07:15:08   0 B
result/jobid=ad8adbd5-bd6e-4c96-a954-efabfb0fa874/part-00000-7b2aff6b-68d3-404e-9588-549b0f964acd-c000-attempt_20200325071505_0005_m_000000_0.csv   Mar 25, 2020 at 07:15:06   30.84 KiB
testdata1.txt                                                                                                                                       Jun 28, 2022 at 00:15:04   25.48 KiB
testdata4.txt                                                                                                                                       Jun 28, 2022 at 00:31:58   25.48 KiB
testdata5.txt                                                                                                                                       Jun 28, 2022 at 00:34:43   25.48 KiB
testdata6.txt                                                                                                                                       Jul 04, 2022 at 02:50:39   25.48 KiB
testdata8.txt                                                                                                                                       Jul 04, 2022 at 03:04:29   25.48 KiB
```
```txt:destination側bucket
$ ibmcloud cos objects --bucket mybucket102
OK
Found 11 objects in bucket 'mybucket102':

Name                    Last Modified              Object Size
404_not_found.png       Apr 01, 2022 at 00:15:11   408.46 KiB
error.html              Oct 28, 2020 at 04:32:32   195 B
favicon.ico             Oct 28, 2020 at 04:21:36   63.71 KiB
index.html              Mar 31, 2022 at 23:31:10   284 B
ninja.jpg               Oct 28, 2020 at 04:16:09   23.67 KiB
ojigi_animal_neko.png   Mar 31, 2022 at 06:23:49   348.42 KiB
sorry.html              Apr 01, 2022 at 02:48:01   423 B
style.css               Oct 28, 2020 at 04:16:12   110 B
testdata1.txt           Jun 28, 2022 at 00:15:04   25.48 KiB
testdata6.txt           Jul 04, 2022 at 02:50:39   25.48 KiB
testdata8.txt           Jul 04, 2022 at 03:04:29   25.48 KiB
```
```txt:destination側bucket
$ ibmcloud target -r us-south
$ ibmcloud cos objects --bucket mybucket103
OK
Found 3 objects in bucket 'mybucket103':

Name                   Last Modified              Object Size
backup/testdata7.txt   Jul 04, 2022 at 02:54:40   25.48 KiB
testdata4.txt          Jun 28, 2022 at 00:31:58   25.48 KiB
testdata5.txt          Jun 28, 2022 at 00:34:43   25.48 KiB
```


## テスト7: レプリケーションルール作成前から存在するデータを同期する。

今回はCentOS7のサーバーでCLIを実行したため、[ここ](https://qiita.com/testnin2/items/8c2bf7990ef55b4abf7d)を参考にして、python3のvenvを構成する。

```
[root@syasudacentos7 ~]# source python368/bin/activate
(python368) [root@syasudacentos7 ~]# pip install --upgrade pip
(python368) [root@syasudacentos7 ~]# pip install ibm-cos-sdk
```

レプリケーションのためのサンプルコードは、[IBM Cloud docs](https://cloud.ibm.com/docs/cloud-object-storage?topic=cloud-object-storage-replication-overview&locale=en)に存在する。

:::note warn
サンプルコードにミスがありました（修正依頼中）。docsのサンプルコードには、`TaggingDirective='COPY'`の後ろに、`,`が必要です。
:::

```python:replicate-existing-objects.py
import os
import sys
import ibm_boto3
from ibm_botocore.config import Config

# Create client connection
cos = ibm_boto3.client("s3",
                       ibm_api_key_id=os.environ.get('IBMCLOUD_API_KEY'),
                       ibm_service_instance_id=os.environ['SERVICE_INSTANCE_ID'],
                       config=Config(signature_version="oauth"),
                       endpoint_url=os.environ['US_GEO']
                       )

# Define the bucket with existing objects for replication
bucket = os.environ['BUCKET']

def copy_in_place(BUCKET_NAME):
    print("Priming existing objects in " + bucket + " for replication...")

    paginator = cos.get_paginator('list_objects_v2')
    pages = paginator.paginate(Bucket=bucket)

    for page in pages:
        for obj in page['Contents']:
            key = obj['Key']
            print("  * Copying " + key + " in place...")
            try:
                headers = cos.head_object(
                    Bucket=bucket,
                    Key=key
                    )

                md = headers["Metadata"]

                cos.copy_object(
                    CopySource={
                        'Bucket': bucket,
                        'Key': key
                        },
                    Bucket=bucket,
                    Key=key,
                    TaggingDirective='COPY',
                    MetadataDirective='REPLACE',
                    Metadata=md
                    )
                print("    Success!")
            except Exception as e:
                print("    Unable to copy object: {0}".format(e))
    print("Existing objects in " + bucket + " are now subject to replication rules.")

copy_in_place(bucket)
```

:::note
ICOSのinstance IDは、`ibmcloud resource service-instances`で確認できます。
:::


```レプリケーションスクリプトの実行
(python368) [root@syasudacentos7 ~]# export IBMCLOUD_API_KEY=xxxxxxx
(python368) [root@syasudacentos7 ~]# export SERVICE_INSTANCE_ID=xxxxxxx
(python368) [root@syasudacentos7 ~]# export US_GEO=https://s3.private.jp-tok.cloud-object-storage.appdomain.cloud
(python368) [root@syasudacentos7 ~]# export BUCKET=mybucket106
(python368) [root@syasudacentos7 ~]# python replicate-existing-objects.py
Priming existing objects in mybucket106 for replication...
  * Copying Veeam/ in place...
    Success!
  * Copying Veeam/Archive/ in place...
    Success!
  * Copying Veeam/Archive/backup/ in place...
    Success!
  * Copying backup/testdata7.txt in place...
    Success!
  * Copying result/jobid=ad8adbd5-bd6e-4c96-a954-efabfb0fa874 in place...
    Success!
  * Copying result/jobid=ad8adbd5-bd6e-4c96-a954-efabfb0fa874/_SUCCESS in place...
    Success!
  * Copying result/jobid=ad8adbd5-bd6e-4c96-a954-efabfb0fa874/part-00000-7b2aff6b-68d3-404e-9588-549b0f964acd-c000-attempt_20200325071505_0005_m_000000_0.csv in place...
    Success!
  * Copying testdata1.txt in place...
    Success!
  * Copying testdata4.txt in place...
    Success!
  * Copying testdata5.txt in place...
    Success!
  * Copying testdata6.txt in place...
    Success!
  * Copying testdata8.txt in place...
    Success!
Existing objects in mybucket106 are now subject to replication rules.
```



```txt:レプリケーション元の確認
(python368) [root@syasudacentos7 ~]# ibmcloud cos objects --bucket mybucket106
OK
Found 12 objects in bucket 'mybucket106':

Name                                                                                                                                                Last Modified              Object Size
Veeam/                                                                                                                                              Jul 19, 2022 at 23:17:28   0 B
Veeam/Archive/                                                                                                                                      Jul 19, 2022 at 23:17:28   0 B
Veeam/Archive/backup/                                                                                                                               Jul 19, 2022 at 23:17:28   0 B
backup/testdata7.txt                                                                                                                                Jul 19, 2022 at 23:17:29   25.48 KiB
result/jobid=ad8adbd5-bd6e-4c96-a954-efabfb0fa874                                                                                                   Jul 19, 2022 at 23:17:29   0 B
result/jobid=ad8adbd5-bd6e-4c96-a954-efabfb0fa874/_SUCCESS                                                                                          Jul 19, 2022 at 23:17:29   0 B
result/jobid=ad8adbd5-bd6e-4c96-a954-efabfb0fa874/part-00000-7b2aff6b-68d3-404e-9588-549b0f964acd-c000-attempt_20200325071505_0005_m_000000_0.csv   Jul 19, 2022 at 23:17:29   30.84 KiB
testdata1.txt                                                                                                                                       Jul 19, 2022 at 23:17:29   25.48 KiB
testdata4.txt                                                                                                                                       Jul 19, 2022 at 23:17:30   25.48 KiB
testdata5.txt                                                                                                                                       Jul 19, 2022 at 23:17:30   25.48 KiB
testdata6.txt                                                                                                                                       Jul 19, 2022 at 23:17:30   25.48 KiB
testdata8.txt
```


```txt:レプリケーション先の確認
(python368) [root@syasudacentos7 ~]# ibmcloud cos objects --bucket mybucket102
OK
Found 20 objects in bucket 'mybucket102':

Name                                                                                                                                                Last Modified              Object Size
404_not_found.png                                                                                                                                   Apr 01, 2022 at 00:15:11   408.46 KiB
Veeam/                                                                                                                                              Jul 19, 2022 at 23:17:28   0 B
Veeam/Archive/                                                                                                                                      Jul 19, 2022 at 23:17:28   0 B
Veeam/Archive/backup/                                                                                                                               Jul 19, 2022 at 23:17:28   0 B
backup/testdata7.txt                                                                                                                                Jul 19, 2022 at 23:17:29   25.48 KiB
error.html                                                                                                                                          Oct 28, 2020 at 04:32:32   195 B
favicon.ico                                                                                                                                         Oct 28, 2020 at 04:21:36   63.71 KiB
index.html                                                                                                                                          Mar 31, 2022 at 23:31:10   284 B
ninja.jpg                                                                                                                                           Oct 28, 2020 at 04:16:09   23.67 KiB
ojigi_animal_neko.png                                                                                                                               Mar 31, 2022 at 06:23:49   348.42 KiB
result/jobid=ad8adbd5-bd6e-4c96-a954-efabfb0fa874                                                                                                   Jul 19, 2022 at 23:17:29   0 B
result/jobid=ad8adbd5-bd6e-4c96-a954-efabfb0fa874/_SUCCESS                                                                                          Jul 19, 2022 at 23:17:29   0 B
result/jobid=ad8adbd5-bd6e-4c96-a954-efabfb0fa874/part-00000-7b2aff6b-68d3-404e-9588-549b0f964acd-c000-attempt_20200325071505_0005_m_000000_0.csv   Jul 19, 2022 at 23:17:29   30.84 KiB
sorry.html                                                                                                                                          Apr 01, 2022 at 02:48:01   423 B
style.css                                                                                                                                           Oct 28, 2020 at 04:16:12   110 B
testdata1.txt                                                                                                                                       Jul 19, 2022 at 23:17:29   25.48 KiB
testdata4.txt                                                                                                                                       Jul 19, 2022 at 23:17:30   25.48 KiB
testdata5.txt                                                                                                                                       Jul 19, 2022 at 23:17:30   25.48 KiB
testdata6.txt                                                                                                                                       Jul 19, 2022 at 23:17:30   25.48 KiB
testdata8.txt                                                                                                                                       Jul 19, 2022 at 23:17:30   25.48 KiB
```


## テスト8: 双方向レプリケーション

- テスト7の状態では、`mybucket106` -> `mybucket102`のレプリケーションルールが構成されているが、これに加えて`mybucket102` -> `mybucket106`のレプリケーションルールも追加し、既存のobjectをテスト7と同様にして同期。
- 結果、全てのオブジェクトがどちらのbucketに対しても同期されたことが確認できた。


```
(python368) [root@syasudacentos7 ~]# ibmcloud cos objects --bucket mybucket106
OK
Found 20 objects in bucket 'mybucket106':

Name                                                                                                                                                Last Modified              Object Size
404_not_found.png                                                                                                                                   Jul 21, 2022 at 00:02:51   408.46 KiB
Veeam/                                                                                                                                              Jul 21, 2022 at 00:02:51   0 B
Veeam/Archive/                                                                                                                                      Jul 21, 2022 at 00:02:52   0 B
Veeam/Archive/backup/                                                                                                                               Jul 21, 2022 at 00:02:52   0 B
backup/testdata7.txt                                                                                                                                Jul 21, 2022 at 00:02:52   25.48 KiB
error.html                                                                                                                                          Jul 21, 2022 at 00:02:53   195 B
favicon.ico                                                                                                                                         Jul 21, 2022 at 00:02:53   63.71 KiB
index.html                                                                                                                                          Jul 21, 2022 at 00:02:53   284 B
ninja.jpg                                                                                                                                           Jul 21, 2022 at 00:02:53   23.67 KiB
ojigi_animal_neko.png                                                                                                                               Jul 21, 2022 at 00:02:54   348.42 KiB
result/jobid=ad8adbd5-bd6e-4c96-a954-efabfb0fa874                                                                                                   Jul 21, 2022 at 00:02:54   0 B
result/jobid=ad8adbd5-bd6e-4c96-a954-efabfb0fa874/_SUCCESS                                                                                          Jul 21, 2022 at 00:02:54   0 B
result/jobid=ad8adbd5-bd6e-4c96-a954-efabfb0fa874/part-00000-7b2aff6b-68d3-404e-9588-549b0f964acd-c000-attempt_20200325071505_0005_m_000000_0.csv   Jul 21, 2022 at 00:02:54   30.84 KiB
sorry.html                                                                                                                                          Jul 21, 2022 at 00:02:54   423 B
style.css                                                                                                                                           Jul 21, 2022 at 00:02:54   110 B
testdata1.txt                                                                                                                                       Jul 21, 2022 at 00:02:54   25.48 KiB
testdata4.txt                                                                                                                                       Jul 21, 2022 at 00:02:55   25.48 KiB
testdata5.txt                                                                                                                                       Jul 21, 2022 at 00:02:55   25.48 KiB
testdata6.txt                                                                                                                                       Jul 21, 2022 at 00:02:55   25.48 KiB
testdata8.txt                                                                                                                                       Jul 21, 2022 at 00:02:55   25.48 KiB
```
```
(python368) [root@syasudacentos7 ~]# ibmcloud cos objects --bucket mybucket102
OK
Found 20 objects in bucket 'mybucket102':

Name                                                                                                                                                Last Modified              Object Size
404_not_found.png                                                                                                                                   Jul 21, 2022 at 00:02:51   408.46 KiB
Veeam/                                                                                                                                              Jul 21, 2022 at 00:02:51   0 B
Veeam/Archive/                                                                                                                                      Jul 21, 2022 at 00:02:52   0 B
Veeam/Archive/backup/                                                                                                                               Jul 21, 2022 at 00:02:52   0 B
backup/testdata7.txt                                                                                                                                Jul 21, 2022 at 00:02:52   25.48 KiB
error.html                                                                                                                                          Jul 21, 2022 at 00:02:53   195 B
favicon.ico                                                                                                                                         Jul 21, 2022 at 00:02:53   63.71 KiB
index.html                                                                                                                                          Jul 21, 2022 at 00:02:53   284 B
ninja.jpg                                                                                                                                           Jul 21, 2022 at 00:02:53   23.67 KiB
ojigi_animal_neko.png                                                                                                                               Jul 21, 2022 at 00:02:54   348.42 KiB
result/jobid=ad8adbd5-bd6e-4c96-a954-efabfb0fa874                                                                                                   Jul 21, 2022 at 00:02:54   0 B
result/jobid=ad8adbd5-bd6e-4c96-a954-efabfb0fa874/_SUCCESS                                                                                          Jul 21, 2022 at 00:02:54   0 B
result/jobid=ad8adbd5-bd6e-4c96-a954-efabfb0fa874/part-00000-7b2aff6b-68d3-404e-9588-549b0f964acd-c000-attempt_20200325071505_0005_m_000000_0.csv   Jul 21, 2022 at 00:02:54   30.84 KiB
sorry.html                                                                                                                                          Jul 21, 2022 at 00:02:54   423 B
style.css                                                                                                                                           Jul 21, 2022 at 00:02:54   110 B
testdata1.txt                                                                                                                                       Jul 21, 2022 at 00:02:54   25.48 KiB
testdata4.txt                                                                                                                                       Jul 21, 2022 at 00:02:55   25.48 KiB
testdata5.txt                                                                                                                                       Jul 21, 2022 at 00:02:55   25.48 KiB
testdata6.txt                                                                                                                                       Jul 21, 2022 at 00:02:55   25.48 KiB
testdata8.txt                                                                                                                                       Jul 21, 2022 at 00:02:55   25.48 KiB
```