KMSキー暗号化バケットでのS3レプリケーション設定の解決方法

S3のレプリケーションは、データのバックアップや可用性向上など、幅広いユースケースで利用されています。設定が比較的簡単なため、多くのシステムで採用されているのではないでしょうか。

 

しかし、私はKMSキーで暗号化されたS3バケットから、別のリージョンにあるS3バケットへのレプリケーションを試みた際に、うまく動作しない問題に直面しました。

 

この記事では、KMSキー暗号化バケットを使用したS3レプリケーションの設定で必要となるIAMの適切な設定について紹介します。

 

 

S3レプリケーションでハマった

■レプリケーション失敗状況

Amazon S3のレプリケーションは、異なるリージョンや同一リージョン内でデータを複製する機能で、バックアップやデータ分散の目的に利用されます。

 

しかし、ソースバケットがKMSキーで暗号化されている場合、適切な設定を行わないとレプリケーションが失敗します。

 

レプリケーションが失敗したときの、わたしの設定の概要は以下の通りです。

 

ソースバケット ターゲットバケット
リージョン アイルランド バージニア北部
暗号化 SSE-KMS SSE-KMS
バージョニング 有効 有効
S3バケットポリシー デフォルト デフォルト
IAMポリシー レプリケートに必要なアクション
KMSキー アイルランド バージニア北部
KMSキーポリシー IAMロールへの復号許可 IAMロールへの暗号化許可

 

上記設定の場合、レプリケーションが失敗します。

 

 

■結論

今回起きた問題の解決方法は、
レプリケーション用IAMロールに、ソースバケットで利用するKMSキーの復号許可ポリシーをアタッチする
でした。

 

わたしは当初、バケットポリシーやKMSキーポリシーの記述にばかり意識を向けており、レプリケーションルールで使用するIAMロールの設定を見落としていました。

 

 

■具体的なIAMポリシー設定

レプリケーションルールで利用するIAMポリシーの記述は以下の通りです。

 

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DecryptSourceBucketKMSKey",
            "Effect": "Allow",
            "Action": "kms:Decrypt",
            "Resource": "<ソースバケットで使用しているKMSキーARN>"
        },
        {
            "Sid": "EncryptTargetBucketKMSKey",
            "Effect": "Allow",
            "Action": "kms:Encrypt",
            "Resource": "<ターゲットバケットで使用しているKMSキーARN>"
        },
        {
            "Sid": "ListAndGetReplicationConfig",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetReplicationConfiguration"
            ],
            "Resource": "<ソースバケットARN>"
        },
        {
            "Sid": "GetSourceBucketObjectsForReplication",
            "Effect": "Allow",
            "Action": [
                "s3:GetObjectVersionTagging",
                "s3:GetObjectVersionAcl",
                "s3:GetObjectVersionForReplication"
            ],
            "Resource": "<ソースバケットARN>/*"
        },
        {
            "Sid": "ReplicateToTargetBucket",
            "Effect": "Allow",
            "Action": [
                "s3:ReplicateObject",
                "s3:ReplicateTags",
                "s3:ReplicateDelete"
            ],
            "Resource": "<ターゲットバケットARN>/*"
        }
    ]
}

 

 

■IAMロール信頼ポリシー

念のため、IAMロールで設定する信頼ポリシーも記載します。

 

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "s3.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

 

 

■S3レプリケーション余談

ソースバケットがAmazon S3マネージドキー(SSE-S3)を使用し、ターゲットバケットがKMSキー(SSE-KMS)を使用している場合、IAMポリシーにS3のレプリケーション許可だけで動作します。

 

この場合、暗号化キーに関する許可設定は不要です。

 

しかし、ソースバケットをKMSキーで暗号化している場合には、ターゲットバケットのKMSキーに対して暗号化許可を付与する必要になります。

 

まとめ

冒頭で「S3のレプリケーション設定は簡単」と述べましたが、セキュリティレベルを上げると設定は格段に複雑になります

 

この記事では、IAMポリシーに焦点を当てて紹介しましたが、キーポリシーやバケットポリシーを利用してさらに詳細なアクセス制限を設定する場合は、IAMロールやアクションの指定が必要です。

 

S3レプリケーションを活用する際は、今回の内容を参考に、適切な設定で運用を進めてみてください。

 

 

参考リンク:暗号化されたオブジェクトのレプリケート (SSE-S3、SSE-KMS、DSSE-KMS、SSE-C)

 

 

↓ほかの協栄情報メンバーもAmazon S3についての記事を公開しています。ぜひ参考にしてみてください。

 
S3のクロスリージョンレプリケーションについてまとめてみた(saikai)

 
S3のレプリケーション機能を使って、ファイルを別バケットに連携してみる(齊藤弘樹)

 

 

Last modified: 2025-01-25

Author