LoginSignup
1
1

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-05-26

初めに

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 のキー ポリシーを表示または変更することはできません。

注意点2

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

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

1-1. キーの作成手順

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

1-1-1. 対称を選択

image.png

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

image.png

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

image.png

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

image.png

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

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

image.png

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

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

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

image.png

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

image.png

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

image.png

2-1-4. IAMロール

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

image.png

2-1-5. 暗号化設定

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

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

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

image.png

2-1-6. 保存

image.png

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

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

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

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

image.png

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

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

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

{
    "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のバケットポリシー

{
    "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

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

image.png

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

image.png

5. 動作確認

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

image.png

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

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

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

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

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

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

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

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

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

参考記事

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1