【備忘録】AWS S3 クロスリージョンレプリケーション(CRR)の設定方法

<h2>はじめに</h2>
業務でS3のクロスリージョンレプリケーション(以下CRR)の設定をすることがあったので、自分用にメモとして残します。
レプリケーションとは

>ハードウェアを含め同じシステム環境が2セット（稼働系と待機系）用意された環境において リアルタイムにデータをもう一方の環境に複製する技術です。
https://bcblog.sios.jp/what-is-replication/

AWSのドキュメントはこちらです
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/replication.html

CRRとはクロスリージョンなので、その名の通りレプリケーションをAWSのリージョンを跨いで別のバケットにリアルタイムでオブジェクトをコピーしておく設定です。データを別リージョンに逃がしておいて障害時に復旧させるために使用したり、AWSの複数リージョンで稼働しているシステムに組み込むこともできます。

早速ですが設定していきましょう！

<h2>S3バケットの作成</h2>
まずは、CRR元とCRR先のバケットを作成します。CRR元のバケットを東京リージョンに、CRR先のバケットを大阪リージョンに作成したいと思います。
<br><br>
バケット名はCRR元を"ari-crr-test-tokyo"、CRR先を"ari-crr-test-osaka"としておきます。他の設定については、"ACL無効"、"パブリックアクセスをすべてブロック"、バージョニングは"有効"(CRRの要件として両バケットともバージョニングの有効化が必要)、タグは特に無し、デフォルトの暗号化は"無効にする"としておきます。<br>
※今回は検証後削除予定のため設定は適当です。要件に合わせて暗号化やログ記録も設定してください。<br>
<br>
レプリケーション元(東京リージョン)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185845/b7e8ddca-f706-57dd-1011-a8d2957a500c.png)

レプリケーション先(大阪リージョン)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185845/0d009fb8-1a1f-abde-174d-da7d95129058.png)
設定が完了したら「バケットを作成」を押します。

バケットが作成できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185845/af362593-1f7b-fc7e-2d40-29d12b8c594a.png)


<h2>CRR用IAMロールの作成</h2>
※自動作成のIAMロール・IAMポリシーを使用する場合は飛ばしてください。
<br>

まずはIAMロールにアタッチするIAMポリシーを作成します。

設定は画像のように
ListBucket
GetReplicationConfiguration
GetObjectVersionForReplication
GetObjectVersionAcl
GetObjectVersionTagging
GetObjectRetention
GetObjectLegalHold
ReplicateObject
ReplicateDelete
ReplicateTags
ObjectOwnerOverrideToBucketOwner
選択します。
リソースはCRR元と先のバケットとバケット配下全てを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185845/3b1b8ba0-28c3-092a-029e-925f7ccad259.png)

※以下のポリシーをjsonで入力しても問題ありません。
<details><summary>IAMポリシー</summary>

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:ListBucket",
                "s3:GetReplicationConfiguration",
                "s3:GetObjectVersionForReplication",
                "s3:GetObjectVersionAcl",
                "s3:GetObjectVersionTagging",
                "s3:GetObjectRetention",
                "s3:GetObjectLegalHold",
                "s3:ReplicateObject",
                "s3:ReplicateDelete",
                "s3:ReplicateTags",
                "s3:ObjectOwnerOverrideToBucketOwner"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::(CRR元)",
                "arn:aws:s3:::(CRR元)/*",
                "arn:aws:s3:::(CRR先)",
                "arn:aws:s3:::(CRR先)/*"
            ]
        }
    ]
}
```

</details>

今回はタグは特に設定しません。
ポリシー名は"IAMP-ARI-CRR-TEST"としておき、説明は空欄でも構いません。
ポリシー名を入力したら、「ポリシーの作成」を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185845/5d9adf7e-1b3c-1a83-ec1d-2a442e625818.png)

次にIAMロールを作成します。
信頼されたエンティティタイプは"AWSのサービス"、ユースケースは"S3"を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185845/f7434072-bdf8-b3ab-204b-b321bf329c1f.png)
許可ポリシーは先ほど作成したポリシーを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185845/dbfa3303-c6d6-f994-82cb-99a81fc884a9.png)
ロール名は"IAMR-ARI-CRR-TEST"として、ロールも特にタグ付けはしません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185845/e67fdb76-bff1-2211-a343-42ab691c1487.png)
IAMロールが作成できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185845/3f7c4c07-d2a0-f845-a02d-d7abbdaa4978.png)

<h2>CRRの設定</h2>
準備ができたのでCRRの設定をしていきます。
レプリケーション元のバケットの管理タブに移動し、レプリケーションルールの作成を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185845/6bd7ee97-31a5-b3e1-ffd3-d8b19f19274c.png)

ルール名は"RR-ARI-CRR-TEST"としておきます。ちなみにRRはReplicationRuleのRRです。
ステータスは"有効"にチェックを付けます。ソースバケットの設定は"バケット内のすべての～"にチェックを付けます。レプリケーション元バケットの特定のフォルダだけレプリケーションする場合は上の"1つ以上の～"を選択して、プレフィックスを指定してください。送信先は"このアカウントの～"を選択して、「S3の参照」から先ほど作成したレプリケーション先のバケットを指定します。残りはデフォルトのままで特に設定しません。要件に合わせて暗号化なども設定してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185845/ed5cec8a-8ae8-0eaf-4494-68c5cd8f7fa6.png)
※ちなみにIAMロールを「新しいロールの作成」としてRRを設定すると"s3crr_role_for_(レプリケーション元バケット名)"というIAMロールと"s3crr_for_(レプリケーション元バケット名)_XXXXXX"というIAMポリシーが自動生成されます。IAMを管理する時の参考にしてもらえたらと思います。

「保存」を押すと次のようなポップアップが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185845/e3d72e04-98e7-f94d-7496-4df164f2f119.png)
レプリケーション元のバケットにある既存のオブジェクトをレプリケーションする場合は、"はい～"を選択、しない場合は"いいえ～"を選択します。"はい～"を選択した場合はバッチオペレーションジョブを設定(ジョブ結果のレポートの設定とジョブで使用するIAMロール)し実行することで既存のオブジェクトもレプリケーションできます。
CloudShellから次のコピーコマンドを打ってバケットごとコピーすることでも再現可能です。無駄にIAMロールが増えることを考えるとこちらの方が良いと思いますが、レプリケートするオブジェクトの容量が多いとCloudShellがパンクしますので注意が必要です。

```
aws s3 cp s3://(レプリケーション元バケット名) s3://(レプリケーション先バケット名) --recursive 
```
今回はテスト用でオブジェクトが入っていないので、"いいえ～"を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185845/45c6b20f-15e8-381d-5d09-a14ce9e2fb8d.png)
レプリケーションルールができました。これでCRRの設定が完了です。
<h2>CRRの検証</h2>
最後にちゃんとレプリケーションされるか検証します。

初期状態は東京リージョンのバケットも大阪リージョンのバケットも空になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185845/c8c0593e-8597-b4e3-302f-10797d236939.png)
レプリケーション元の東京リージョンのバケットにテスト用のテキストファイルをアップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185845/adfd8f26-d009-3162-372f-0cf943b85c11.png)
アップロードできました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185845/467f442c-f859-a070-cfcb-168953174141.png)
するとレプリケーション先である大阪リージョンのバケットに、東京リージョンに置いたテキストファイルがコピーされている事が確認できました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185845/6099b435-c6a9-3df8-abf7-3794704c7d55.png)

<h2>おわりに</h2>
自分用のメモと言いつつこれを読んだ人がCRRの設定をできるように手順を記載したつもりです。
何か分かりづらい所があればご指摘お願いします。
最後まで読んでくださりありがとうございました！！