AWS S3 双方向クロスアカウントレプリケーション 暗号化したオブジェクトのレプリケーション


# 初めに

1～5はセイムリージョンレプリケーションの手順です。6はクロスリージョンレプリケーションをする際、セイムリージョンレプリケーションと異なる点について触れています。

設定は以下の通りです。

アカウントAのバケット名・・・`account-a-bucket-0525`
アカウントBのバケット名・・・`account-a-bucket-0525`

アカウントAのバケット、アカウントBのバケットはともに以下の3つの設定をしているものとします。

- バージョニングを有効化
- デフォルト暗号化
  - 暗号化キーはKMSのマネージド型キー（カスタマー管理型のキーではなくAWSによって作成されるキー）
- バケット所有者は「希望するバケット所有者」

# 1. レプリケーション用にカスタマー管理型のキーを作成する

**注意点1**

なぜマネージド型キーを使用せず、カスタマー管理型のキーを使用するかという点ですが、**マネージド型キーのキーポリシーは変更できない**からです。

>AWS が管理する CMK または顧客が管理する CMK のキー ポリシーを表示することはできますが、変更できるのは顧客が管理する CMK のキー ポリシーのみです。AWS マネージド CMK のポリシーは、お客様のアカウントで CMK を作成した AWS サービスによって作成および管理されます。AWS が所有する CMK のキー ポリシーを表示または変更することはできません。

https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying.html

**注意点2**

レプリケーション用のキーを作成するときは、キーのタイプは対称を選択します。

>Amazon S3 は対称的な CMK のみをサポートします。非対称 CMK を使用して Amazon S3 でデータを暗号化することはできません。

https://docs.aws.amazon.com/kms/latest/developerguide/services-s3.html

## 1-1. キーの作成手順

**アカウントA**でキーを作成します。

### 1-1-1. 対称を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/02f0a557-2ba9-1387-8dca-721a7659a50f.png)

### 1-1-2. エイリアスを入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/5fe2a446-7d27-c65a-15e2-80e758c018b1.png)

### 1-1-3. キーの管理者を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/944212fb-c8c0-c17e-27b2-4f3494aff6c5.png)

### 1-1-4. キーの使用者を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/57c49060-7f17-5e3e-501f-e964e8d47ecc.png)

### 1-1-5. キーポリシーの変更

「別のAWSアカウントを追加」を選択し、**アカウントB**のユーザーIDを入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/220ea5b7-e159-4788-e763-56d7cbd4c258.png)


# 2. レプリケーションルールを作成する

## 2-1. アカウントAのレプリケーションルール

### 2-1-1. ルール名、ステータスを設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/295e6ad9-d78e-fcbb-c5e7-34193115b4bd.png)


### 2-1-2. ソースバケットの設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/8ba97e49-5657-b1ed-7e24-c5ff26ba1ebd.png)

### 2-1-3. 送信先を設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/71349aa4-a41d-44ee-9eca-9de749caab2a.png)

### 2-1-4. IAMロール

「新しいロールの作成」を選択しないと、次の暗号化の設定で「ソースオブジェクトを復号するするためのAWS KMSキー」を選択できません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/291015ba-0d89-a5ce-c918-7fc85ab4db3b.png)

### 2-1-5. 暗号化設定

「ソースオブジェクトを復号するためのAWS KMSキー」とは、**アカウントA**が所有するバケット`account-a-bucket-0525`内にあるレプリケートされたオブジェクトをGETする際、どのキーを用いて復号するか、というキーのことです。

「送信先オブジェクトを暗号化するためのAWS KMSキー」とは、**アカウントA**にのオブジェクトを**アカウントB**のバケットにレプリケートする際、どのキーを用いて暗号化するか、というキーのことです。

どちらも先ほど作成した`s3-replication`キーを指定します。前者はチェックボックス、後者はARNを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/d3768bae-7001-c8e4-344d-6cbc393a75a6.png)


### 2-1-6. 保存

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/2609c010-27c8-288f-0ee4-c769e571b183.png)

## 2-2. アカウントBのレプリケーションルール

**アカウントA**と異なる部分は、以下2点です。

- 2-1-3. 送信先を設定
- 2-1-5. 暗号化設定

2-1-3 については、**アカウントA**のバケットを指定します。
2-1-5 については、どちらも**アカウントA**の`s3-replication`のARNを入力します。「ソースオブジェクトを復号するするためのAWS KMSキー」ですが、チェックボックスには**アカウントA**のキーは表示されません。その下にある「カスタマーのARN - オプション」の「キーの追加」をクリックします。その後、ARNを入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/8b472e9d-5f5e-60e8-9f82-86e4a2e51e77.png)


# 3. バケットポリシーを編集する

クロスアカウントなので、バケットポリシーの設定が必要です。

## 3-1. アカウントAのバケットポリシー

```json
{
    "Version": "2012-10-17",
    "Id": "",
    "Statement": [
        {
            "Sid": "Set permissions for objects",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::ACCOUNT_B_ID:role/service-role/s3crr_role_for_account-b-bucket-0525"
            },
            "Action": [
                "s3:ReplicateObject",
                "s3:ReplicateDelete"
            ],
            "Resource": "arn:aws:s3:::account-a-bucket-0525/*"
        },
        {
            "Sid": "Set permissions on bucket",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::ACCOUNT_B_ID:role/service-role/s3crr_role_for_account-b-bucket-0525"
            },
            "Action": [
                "s3:GetBucketVersioning",
                "s3:PutBucketVersioning"
            ],
            "Resource": "arn:aws:s3:::account-a-bucket-0525"
        },
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::ACCOUNT_B_ID:role/service-role/s3crr_role_for_account-b-bucket-0525"
            },
            "Action": "s3:ObjectOwnerOverrideToBucketOwner",
            "Resource": "arn:aws:s3:::account-a-bucket-0525/*"
        }
    ]
}
```

## 3-2. アカウントBのバケットポリシー

```json
{
    "Version": "2012-10-17",
    "Id": "",
    "Statement": [
        {
            "Sid": "Set permissions for objects",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::ACCOUNT_A_ID:role/service-role/s3crr_role_for_account-a-bucket-0525"
            },
            "Action": [
                "s3:ReplicateObject",
                "s3:ReplicateDelete"
            ],
            "Resource": "arn:aws:s3:::account-b-bucket-0525/*"
        },
        {
            "Sid": "Set permissions on bucket",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::ACCOUNT_A_ID:role/service-role/s3crr_role_for_account-a-bucket-0525"
            },
            "Action": [
                "s3:GetBucketVersioning",
                "s3:PutBucketVersioning"
            ],
            "Resource": "arn:aws:s3:::account-b-bucket-0525"
        },
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::ACCOUNT_A_ID:role/service-role/s3crr_role_for_account-a-bucket-0525"
            },
            "Action": "s3:ObjectOwnerOverrideToBucketOwner",
            "Resource": "arn:aws:s3:::account-b-bucket-0525/*"
        }
    ]
}
```

# 4. IAMポリシーの編集

レプリケーションルールの設定「4. IAMロール」でAWSによって作成されたポリシーですが、修正が必要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/4863d599-458b-ff60-8caa-97b0f88fee01.png)

警告が出ている部分を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/b03c5fdb-9f25-bdb7-f33f-cd6f03328597.png)

右の（編集｜削除）となっている「削除」をクリックし、以下のように警告が消えた状態で変更を保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/c8808663-c66f-0031-038a-014fd31caaac.png)

# 5. 動作確認

双方向でレプリケーションステータスが「COMPLETED」になっていることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/da9bc81e-7ec6-e8a3-ee74-cace6c252d18.png)

# 6. クロスリージョンレプリケーション

セイムリージョンレプリケーションと異なる点は、次の2点です。

- **1. レプリケーション用にカスタマー管理型のキーを作成する**という手順を両方のリージョンで行う
- **2-1-5. 暗号化設定**

クロスリージョンレプリケーションでの注意点は、オブジェクトの暗号化・復号を行うキーは、そのオブジェクトをレプリケート・GETするバケットと同じリージョンに属する必要がある点です。

>AWS KMS CMK は、レプリケート先バケットと同じ AWS リージョン内で作成されている必要があります。

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/replication-config-for-kms-objects.html

まず、**1. レプリケーション用にカスタマー管理型のキーを作成する**を両方のリージョンで行います。その後、**2-1-5. 暗号化設定**については以下の通り設定します。

|ユーザー|ソースオブジェクトを復号するためのAWS KMSキー|送信先オブジェクトを暗号化するためのAWS KMSキー|
|---|---|---|
|アカウントA|アカウントAのKMSキー|アカウントBのKMSキー|
|アカウントB|アカウントBのKMSキー|アカウントAのKMSキー|

「自分のバケット内のオブジェクトは自分のKMSキーで復号、相手のバケット内のオブジェクトは相手のKMSキーで暗号化」と覚えておくと良いと思います。

その他はセイムリージョンレプリケーションと同じ手順です。

# 参考記事

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/replication-walkthrough1.html

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/replication-config-for-kms-objects.html

https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying.html

https://docs.aws.amazon.com/kms/latest/developerguide/services-s3.html