📌

【初心者向け】Amazon S3 SSE-KMS暗号化バケットのクロスアカウントレプリケーション

に公開

はじめに

本ページは個人の勉強で使用することを目的に作成しておりますが、記載の誤り等が含まれる場合がございます。
最新の情報についてはAWS公式ドキュメントをご参照ください。

やること

  • 異なるAWSアカウント間でのKMS CMKで暗号化されたAmazon S3のレプリケーションを行う。
  • リソース名
レプリケーション元リソース リソース名
S3バケット s3-source-backet
KMS CMK s3-source
レプリケーション先リソース リソース名
S3バケット s3-replication-backet
KMS CMK s3-replication

1. 事前準備 -レプリケーション先アカウント

  1. レプリケーション先で以下のKMS CMKを作成する。
  • キーのタイプ:対称
  • エイリアス:s3-replication
  • キーの管理者:レプリケーション先アカウントのIAMユーザー
  • キーの使用者:レプリケーション先アカウントのIAMユーザー
  • 別のAWSアカウントを追加:※レプリケーション元アカウントID
  1. s3-replicationのARNを控えておく。


  1. 以下のS3バケットを作成する。
  • バケット名:s3-replication-backet
  • このバケットのブロックパブリックアクセス設定:パブリックアクセスをすべて ブロック
  • バケットのバージョニング:有効にする(必須)
  • デフォルト暗号化:kms
  • KMSキー:s3-replication
  1. s3-replication-backetのARNを控えておく。

2. 事前準備 - レプリケーション元アカウント

  1. 以下のAWS KMSキーを作成する。
  • キーのタイプ:対称
  • エイリアス:s3-source
  • キーの管理者:レプリケーション元アカウントのIAMユーザー
  • キーの使用者:レプリケーション元アカウントのIAMユーザー
  • 別のAWSアカウントを追加:未選択
  1. 以下のS3バケットを作成する
  • バケット名:s3-source-backet
  • このバケットのブロックパブリックアクセス設定:パブリックアクセスをすべて ブロック
  • バケットのバージョニング:有効にする(必須)
  • デフォルト暗号化:kms
  • KMSキー:s3-source

3. レプリケーションルールの作成 - レプリケーション元アカウント

1.s3-source-backetの管理タブから、レプリケーションルールを作成を選択。

  1. レプリケーションルールの設定を行う。
  • レプリケーションルール名:replication-rule-s3-source-backet
  • ステータス:有効
  1. ソースバケットの設定を行う。
  • ルールスコープを選択:バケット内のすべてのオブジェクトに適用
  1. 送信先の設定を行う。
  • 送信先:別のアカウントのバケットを指定する
  • アカウントID:レプリケーション先アカウントID
  • オブジェクト所有者を送信先バケット所有者に変更:チェック
  1. IAMロールの設定を行う。
  • 既存のIAMロールから選択:チェック
  • IAMロール:新しいロールの作成
  1. 暗号化の設定を行う。
  • AWS KMSで暗号化されたオブジェクトをレプリケートする:選択
  • ソースオブジェクトを復号するためのAWS KMSキー:s3-source
    ※レプリケーション元S3バケットのオブジェクトをGETする際、復号化に使用するKMSキー。


  • ※送信先オブジェクトを暗号化するためのAWS KMSキー:AWS KMSキーARNを入力する
  • AWS KMSキーARN:レプリケーション先AWSアカウントのKMSキーARN
    ※レプリケーション先のS3バケットにオブジェクトをPUTする際、暗号化に用いるKMSキー。

  1. 送信先ストレージクラスと、追加のレプリケーションオプションはチェックせず保存を選択する。

4. サービスロールの編集 - レプリケーション元アカウント

  1. 手順3.5で作成したIAMロールを以下に修正する。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:ListBucket",
                "s3:GetReplicationConfiguration",
                "s3:GetObjectVersionForReplication",
                "s3:GetObjectVersionAcl",
                "s3:GetObjectVersionTagging",
                "s3:GetObjectRetention",
                "s3:GetObjectLegalHold"
            ],
            "Effect": "Allow",
            "Resource": [
                "${レプリケーション元のS3バケットARN}",
                "${レプリケーション元のS3バケットARN}/*"
            ]
        },
        {
            "Action": [
                "s3:ReplicateObject",
                "s3:ReplicateDelete",
                "s3:ReplicateTags",
                "s3:GetObjectVersionTagging",
                "s3:ObjectOwnerOverrideToBucketOwner"
            ],
            "Effect": "Allow",
            "Condition": {
                "StringLikeIfExists": {
                    "s3:x-amz-server-side-encryption": [
                        "aws:kms",
                        "AES256"
                    ]
                }
            },
            "Resource": [
                "${レプリケーション先のS3バケットARN}/*"
            ]
        },
        {
            "Action": [
                "kms:Decrypt"
            ],
            "Effect": "Allow",
            "Resource": [
                "${レプリケーション元のKMSキーARN}"
            ]
        },
        {
            "Action": [
                "kms:Encrypt"
            ],
            "Effect": "Allow",
            "Resource": [
                "$レプリケーション先のKMSキーARN}"
            ]
        }
    ]
}
  1. レプリケーション用のサービスロールARNを控えておく。

5. バケットポリシー編集 - レプリケーション先アカウント

1.レプリケーション先バケットs3-replication-backetアクセス許可タブから、バケットポリシーの編集を選択する。

  1. 以下のバケットポリシーに修正して変更の保存をクリックする。
{
    "Version": "2012-10-17",
    "Id": "",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "${レプリケーション用のサービスロールARN}"
            },
            "Action": [
                "s3:ReplicateObject",
                "s3:ReplicateDelete",
                "s3:ObjectOwnerOverrideToBucketOwner"
            ],
            "Resource": "${レプリケーション先S3バケットARN}/*"
        },
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "${レプリケーション用のサービスロールARN}"
            },
            "Action": [
                "s3:List*",
                "s3:GetBucketVersioning",
                "s3:PutBucketVersioning"
            ],
            "Resource": "${レプリケーション先S3バケットARN}"
        }
    ]
}

6. 動作検証

  1. レプリケーション元バケットs3-source-backetにテキストファイルreplication-test.txtをアップロードする。

  2. replication-test.txtの管理画面に移動し、オブジェクト管理の概要のレプリケーションステータスを確認する。

  • アップロード直後、PENDINGと表示される。
  1. しばらくしてCOMPLETEDと表示され、レプリケーションが成功する。

  2. レプリケーション先バケットs3-replication-backetの管理画面から、replication-test.txtがレプリケーションされた事を確認する。

おわりに

  • レプリケーション用のサービスロールは事前に作成しておいた方がスマートですね。。
  • S3バケットに対して別アカウントへの許可を付与したい場合、基本的にバケットポリシーに明示的な許可が必要になります。その辺りの話も機会があればまとめたいと思います。
  • サービスロールについて、"Condition"要素でもう少し厳格に記述したい場合は以下の記事が詳しいです。

https://dev.classmethod.jp/articles/s3-cross-account-replication-with-kms/

参考

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

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

Discussion