【S3】レプリケーションによる既存オブジェクト上書き動作


# はじめに
今回は下記をいじることでレプリケーションの挙動を理解しようとしています
- 設定変更（レプリケーションルール 有効 OR 無効）
- レプリケーション（バッチ OR 通常）
- 更新（オブジェクトの削除やアップロード）

設定変更およびオブジェクト更新をおこない、必要に応じて通常のレプリケーションとバッチレプリケーションを使い分けるというイメージです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/634267a0-bcee-e894-6e3f-20128c04d7f6.png)

# 前提
- ターゲットのバケットにはソースにアップロードする予定のオブジェクトをすでに格納しています（しかも同じキー）
- IAMロールやバケットの作成および必要な設定は済ませておいてください
    - IAMロールはバッチレプリケーションと通常のレプリケーションで必要な権限が異なります

※IAMロール参考（バッチの方はコンソール作成時にIAMポリシーのJSON作ってくれるのでそちらを使ったほうが楽です）
>ユーザーに代わってレプリケーションタスクを実行する権許可をロールに付与します
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/setting-repl-config-perm-overview.html#setting-repl-config-same-acctowner
S3 で生成されたマニフェストを使用して保存する場合のポリシー
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/s3-batch-replication-policies.html

# 検証
下記を検証します
①ソースの既存オブジェクトの上書き動作
②ソースの新規オブジェクトの上書き動作
③ソースの特定バージョンを削除した場合の動作
④ソースのオブジェクト（バージョン指定なし）を削除した場合の動作

そのために時系列として下記のような手順を踏みます
①ソースおよびターゲットにオブジェクトをアップロード（ソースからアップロード）
②レプリケーションルールを設定&有効化
③ソースに新規オブジェクトアップロード
④ソースのオブジェクトを削除

## ①ソースおよびターゲットにオブジェクトをアップロード（ソースからアップロード）
検証のためにオブジェクトをアップロードして準備します
### ソース
- レプリケーション無効化時点
test1.txtアップロード→削除→アップロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/3f6429e5-bdca-c823-96b6-9afd09ee11cd.png)

### ターゲット
- ソースのレプリケーション無効化時点
test1.txtアップロード
test2.txtアップロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/5c73772e-529f-1884-2054-6614c40f6f06.png)

## ②レプリケーションルールを設定&有効化
キャプチャないですが特に特別な設定はせずにルール作成&有効化しました
## ③ソースに新規オブジェクトアップロード
### ソース
test2.txtをアップロードして「②ソースの新規オブジェクトの上書き動作」を確認
- レプリケーション有効化後
test2.txtアップロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/4c5b92ec-d261-595c-a061-91875da6edc2.png)
### ターゲット
- レプリケーション有効化後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/56e6b323-fc4a-09d9-c7b6-4a31b33811be.png)
test1.txtは変化なし、既存オブジェクトは更新されないのでバッチレプリケーションが必要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/f023ad6e-953b-a065-ef74-da70227a4f85.png)
test2.txtが上書きされたので、既存のターゲットのオブジェクトとソースのオブジェクトが同じキーの場合、上書きされる。ただし**バージョンが更新されるだけで過去バージョンのオブジェクトは消えない**
※参考
>オブジェクトの更新をソース バケットから宛先バケットにコピー
https://docs.aws.amazon.com/AmazonS3/latest/userguide/replication-walkthrough1.html

- バッチレプリケーション実施後
バッチレプリケーションを実施して「①ソースの既存オブジェクトの上書き動作」を確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/4e71d8ac-1604-c3de-9d7e-6fff14f7494b.png)
こちらを見るとターゲットで作ったオブジェクトが最新のものとなっているため**ソースとターゲットで同じキーのオブジェクトが存在する場合アップロードした時間順にマージされる**。実際更新日時を見るとそうなっていた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/14a3b220-7d52-2c60-dde5-f1cf2e944673.png)

## ④ソースのオブジェクトを削除
次に削除の挙動
test1.txtの最も古いバージョンを削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/93026851-4e6a-1660-6b44-ed2f76459c81.png)

test2.txtをバージョン指定せず削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/7354f848-685f-2db2-a4e0-d0a72f601c30.png)

その結果ソースはこうなった、ターゲットを確認すると**オブジェクトに変化なし**でした
バージョン指定しない場合オブジェクトを削除すると削除マーカーが挿入されますが、削除マーカーをレプリケーションする設定にしないと反映されないよう。バージョン指定した場合は削除されないようになってる


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/fc8ade15-e45f-6469-7f47-cd4fb9c6eb90.png)

※参考
>デフォルトでは、S3 レプリケーションが有効で、レプリケーション元バケットでオブジェクトが削除されると、Amazon S3 はレプリケート元バケットにのみ削除マーカーを追加します
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/delete-marker-replication.html

>削除するオブジェクト バージョン ID を指定すると、Amazon S3 はソース バケット内のそのオブジェクト バージョンを削除します。ただし、宛先バケットでの削除は複製されません。
https://docs.aws.amazon.com/AmazonS3/latest/userguide/replication-walkthrough1.html