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