【AWS】【S3】レプリケーションのレプリケーションはできないし、複数宛先へのレプリケーションもできない→複数宛先へのレプリケーションには対応

#はじめる前に・・・
当記事を書いた時点では複数宛先へのレプリケーションは不可でしたが、現在は対応しているようです。
https://aws.amazon.com/jp/blogs/news/new-amazon-s3-replication-adds-support-for-multiple-destination-buckets/
これができなかった時代もあったんだ〜という、歴史書としてお読みくださいませ。

#はじめに
S3にはセイムリージョンレプリケーションという機能があります。
https://aws.amazon.com/jp/about-aws/whats-new/2019/09/amazon-s3-introduces-same-region-replication/
この機能を利用して、ログを特定のアカウントに集約して分析に使っちゃうなんてのはどう？的なことが公式のブログに書いてあったりもします。
https://aws.amazon.com/jp/blogs/news/aggregating-logs-with-s3-same-region-replication/

一方で、争いの絶えない社会で人間は色々なことを要求します。
例えば、ある一連のシステムから出るログのうち、

* システム運用と、セキュリティ監視で用途別のアカウントにログ集約したい。だから<font color="Red">2箇所に同時にレプリケーションしたい</font>。
* 監査目的、あるいは業界のルールを満たすために、XX年ログを保管したい。
 * ログ保管と分析の役割を持つ組織がそれぞれ存在し、ログ分析する組織は長期保管のコストを払いたくない。
 * よし、じゃあ<font color="Red">ログ集約アカウントでXX年保管して、必要なログをログ分析アカウントにもっかいレプリケーションしよう！</font>

といったことを実施したくなる日が必ず来ると思います。
残念ながら、これらが **できない** ということを確かめたので、記事にします。


#結論
##レプリケーションしたものを再度レプリケーション（できない）
レプリケートされたオブジェクトを再度レプリケートさせることはできませんでした
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/replication-what-is-isnot-replicated.html
![多重レプリケーション.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614684/48c34a39-8020-6c2a-af26-7a2579a2016c.png)

##複数宛先へのレプリケーション（できない）→2020年12月〜できるようになった！
https://aws.amazon.com/jp/blogs/news/new-amazon-s3-replication-adds-support-for-multiple-destination-buckets/

~~レプリケーション先は1つのバケットしか指定できませんでした。~~
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/replication-add-config.html#replication-config-optional-dest-config
![宛先複数レプリケーション.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614684/a71a057b-2f77-9214-5c6e-158be70db0b4.png)

#検証
##前提条件

* 3つのアカウントを準備し、それぞれのアカウントで以下の通りバケットを作成しました。なお、バケット名以外の設定値は全て同じとしました。

| アカウント | バケット名 |
|:-:|:-:|
| 1  | nakayoshi-1  | 
|  2 |  nakayoshi-2 | 
|   3| nakayoshi-3  | 


* リージョンは ap-northeast-1（東京） を使用しました。
 

##共通作業
###バケット作成
共通作業として、バケットを作成します。
S3管理画面から「バケットを作成する」を選択し、以下の設定を行います。
####名前とリージョン
| 設定項目 | 値 | 備考 |
|:--|:--|:--|
| バケット名  | nakayoshi-1<br>nakayoshi-2<br>nakayoshi-3  | アカウントごとに名前をつける  |
| リージョン  | アジアパシフィック（東京）  |   |
| 既存のバケットから設定をコピー | 空欄  |   |

####オプションの設定
| 設定項目 | 値 | 備考 |
|:--|:--|:--|
| バージョニング  | <font color="red">ON</font>  |  https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/replication.html#replication-requirements |
| サーバーアクセスのログ記録  | OFF  |   |
|  Tags | OFF  |   |
|  オブジェクトレベルのログ記録 |  OFF |   |
| デフォルト暗号化  |  OFF |   |
|  オブジェクトのロック |  OFF |   |
| CloudWatch リクエストメトリクス  |OFF   |   |

####アクセス許可の設定
パブリックアクセスを全てブロックにチェックを入れる。

####作成後確認
プロパティを見ると以下のようになります。
![2020-09-04 19_26_46-S3 Management Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614684/5beb33c5-bb14-8318-400e-99ef9759991e.png)



##レプリケーションのレプリケーション検証
以下2つのレプリケーションルールを作成し、レプリケーションの挙動を確認します。

* nakayoshi-1 → nakayoshi-2
* nakayoshi-2 → nakayoshi-3

###レプリケーション設定
S3管理画面から「バケット名 → 管理 → レプリケーション → ルールの追加」の順で選択し、ルールを作成します。
####ソースの設定
| 設定項目 | nakayoshi-1 | nakayoshi-2 | 備考 |
|:-:|:-:|:-:|:-:|
| ソースの設定  | nakayoshi-1 のすべてのコンテンツ | nakayoshi-2 のすべてのコンテンツ  |   |
|  AWS KMSで暗号化されたオブジェクトを複製する |  OFF |OFF  |   |
####送信先の設定
| 設定項目 | nakayoshi-1 | nakayoshi-2 | 備考 |
|:-:|:-:|:-:|:-:|
| 送信先バケット  | nakayoshi-2のアカウントIDとバケット名 | nakayoshi-3のアカウントIDとバケット名  |   |
|  レプリケートされたオブジェクト用のストレージクラスを変更 |  OFF |OFF  |   |
|  オブジェクト所有者を送信先バケット所有者に変更 |  <font color="red">ON</font> |<font color="red">ON</font>  |  ONにしないとレプリケート先でオブジェクトにアクセスできない。<br>https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/replication-change-owner.html |
| レプリケーション時間のコントロール |  OFF |OFF  |   |
####規則のオプションの構成
| 設定項目 | nakayoshi-1 | nakayoshi-2 | 備考 |
|:-:|:-:|:-:|:-:|
| IAMロール  | 新しいIAMロールを作成 | 新しいIAMロールを作成  |  s3crr_role_for_<ルール名>のIAMロールが新しくできる |
|  ルール名 | nakayoshi-1 to nakayoshi-2 |nakayoshi-2 to nakayoshi-3  |   |
|  ステータス | 有効 |有効  |   |
|  バケットポリシー | <font color="red">メモっておく</font> |<font color="red">メモっておく</font>  |   |
####作成後確認
作成したルールが以下のように表示されます。
![2020-09-04 19_29_09-S3 Management Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614684/31811cbf-c61f-c58e-a7f0-2e7458b74ac6.png)
![2020-09-04 19_31_38-S3 Management Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614684/7059b233-48ff-2d8c-ebef-55f29d23f8cd.png)

###バケットポリシーの追加
ソースのバケットが送信先のバケットにレプリケートできるよう、送信先側のバケットでバケットポリシーを記載します。
関係は以下の通りです。

| バケット | 設定するポリシー | 備考 |
|:-:|:-:|:-:|
| nakayoshi-2 | nakayoshi-1設定時にメモっておいた内容 |  |
| nakayoshi-3 | nakayoshi-2設定時にメモっておいた内容 |  |

以下のような警告っぽいメッセージが表示されますが、攻略を先に進めて大丈夫です。
![2020-09-04 19_35_43-S3 Management Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614684/822dc075-844c-379a-9e03-7fa765019b0f.png)

###オブジェクトを置いて動きを確認する（検証結果）
nakayoshi-1とnakayoshi-2に任意のオブジェクトをアップロードして、動きを確かめます。
以下のような結果になり、レプリケーションのレプリケーションができないことが確認できるはずです。

| パターン | 結果 | 備考 |
|:-:|:-:|:-:|
| nakayoshi-1に置いたオブジェクト | nakayoshi-2にレプリケートされる。<br>nakayoshi-3にはレプリケート<font color="red">されない。</font> |  |
| nakayoshi-2に置いたオブジェクト | nakayoshi-3にレプリケートされる。 |  |


##複数宛先へのレプリケーション検証
nakayoshi-1に、nakayoshi-3宛のルールを追加して動きを確認します。
###レプリケーション設定
S3管理画面から「バケット名 → 管理 → レプリケーション → ルールの追加」の順で選択し、ルールを作成します。
####ソースの設定
| 設定項目 | nakayoshi-1 | 
|:-:|:-:|:-:|:-:|
| ソースの設定  | nakayoshi-1 のすべてのコンテンツ |
|  AWS KMSで暗号化されたオブジェクトを複製する |  OFF |
####送信先の設定
| 設定項目 | nakayoshi-1 | 
|:-:|:-:|:-:|:-:|
| 送信先バケット  | nakayoshi-2のアカウントIDとバケット名 | 
|  レプリケートされたオブジェクト用のストレージクラスを変更 |  OFF |OFF  |   |
|  オブジェクト所有者を送信先バケット所有者に変更 |  <font color="red">ON</font> |<br>https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/replication-change-owner.html |
| レプリケーション時間のコントロール |  OFF |
####規則のオプションの構成
| 設定項目 | nakayoshi-1 | 
|:-:|:-:|:-:|:-:|
| IAMロール  | 編集→新しいIAMロールを作成 |
|  ルール名 | nakayoshi-2 to nakayoshi-3 |
|  優先度 | 高 |
|  ステータス | 有効 |
|  バケットポリシー | <font color="red">メモっておく</font> |
###設定後確認（検証結果）
以下のように、<font color="red">宛先が別のルールを追加することにより、グローバル設定のソースと送信先が書き換わってしまいます。</font>
このことから、2箇所同時のレプリケーションは設定が行えないことが分かります。

* ルール追加前
![2020-09-04 19_44_01-S3 Management Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614684/430054fe-cd4f-5550-fa33-0eab5f049c3f.png)

* ルール追加後
![2020-09-04 19_59_23-S3 Management Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614684/e15cf1a5-cb3c-b630-af9b-c437aa461a1f.png)


# さいごに
この記事では以下のことを確認しました。

* レプリケーションのレプリケーションはできないこと
* 複数宛先へのレプリケーションはできないこと

日常的に使いたくなりそうなユースケースではるものの、
できないものはできないので、争いのない世の中にしていきましょう。