📌
【初心者向け】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. 事前準備 -レプリケーション先アカウント
- レプリケーション先で以下のKMS CMKを作成する。
- キーのタイプ:対称
- エイリアス:s3-replication
- キーの管理者:レプリケーション先アカウントのIAMユーザー
- キーの使用者:レプリケーション先アカウントのIAMユーザー
- 別のAWSアカウントを追加:※レプリケーション元アカウントID
- s3-replicationのARNを控えておく。
- 以下のS3バケットを作成する。
- バケット名:s3-replication-backet
- このバケットのブロックパブリックアクセス設定:パブリックアクセスをすべて ブロック
- バケットのバージョニング:有効にする(必須)
- デフォルト暗号化:kms
- KMSキー:s3-replication
- s3-replication-backetのARNを控えておく。
2. 事前準備 - レプリケーション元アカウント
- 以下のAWS KMSキーを作成する。
- キーのタイプ:対称
- エイリアス:s3-source
- キーの管理者:レプリケーション元アカウントのIAMユーザー
- キーの使用者:レプリケーション元アカウントのIAMユーザー
- 別のAWSアカウントを追加:未選択
- 以下のS3バケットを作成する
- バケット名:s3-source-backet
- このバケットのブロックパブリックアクセス設定:パブリックアクセスをすべて ブロック
- バケットのバージョニング:有効にする(必須)
- デフォルト暗号化:kms
- KMSキー:s3-source
3. レプリケーションルールの作成 - レプリケーション元アカウント
1.s3-source-backetの管理タブから、レプリケーションルールを作成を選択。
- レプリケーションルールの設定を行う。
- レプリケーションルール名:replication-rule-s3-source-backet
- ステータス:有効
- ソースバケットの設定を行う。
- ルールスコープを選択:バケット内のすべてのオブジェクトに適用
- 送信先の設定を行う。
- 送信先:別のアカウントのバケットを指定する
- アカウントID:レプリケーション先アカウントID
- オブジェクト所有者を送信先バケット所有者に変更:チェック
- IAMロールの設定を行う。
- 既存のIAMロールから選択:チェック
- IAMロール:新しいロールの作成
- 暗号化の設定を行う。
- AWS KMSで暗号化されたオブジェクトをレプリケートする:選択
- ソースオブジェクトを復号するためのAWS KMSキー:s3-source
※レプリケーション元S3バケットのオブジェクトをGETする際、復号化に使用するKMSキー。
- ※送信先オブジェクトを暗号化するためのAWS KMSキー:AWS KMSキーARNを入力する
- AWS KMSキーARN:レプリケーション先AWSアカウントのKMSキーARN
※レプリケーション先のS3バケットにオブジェクトをPUTする際、暗号化に用いるKMSキー。
- 送信先ストレージクラスと、追加のレプリケーションオプションはチェックせず保存を選択する。
4. サービスロールの編集 - レプリケーション元アカウント
- 手順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}"
]
}
]
}
- レプリケーション用のサービスロールARNを控えておく。
5. バケットポリシー編集 - レプリケーション先アカウント
1.レプリケーション先バケットs3-replication-backetのアクセス許可タブから、バケットポリシーの編集を選択する。
- 以下のバケットポリシーに修正して変更の保存をクリックする。
{
"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. 動作検証
-
レプリケーション元バケットs3-source-backetにテキストファイルreplication-test.txtをアップロードする。
-
replication-test.txtの管理画面に移動し、オブジェクト管理の概要のレプリケーションステータスを確認する。
- アップロード直後、PENDINGと表示される。
-
しばらくしてCOMPLETEDと表示され、レプリケーションが成功する。
-
レプリケーション先バケットs3-replication-backetの管理画面から、replication-test.txtがレプリケーションされた事を確認する。
おわりに
- レプリケーション用のサービスロールは事前に作成しておいた方がスマートですね。。
- S3バケットに対して別アカウントへの許可を付与したい場合、基本的にバケットポリシーに明示的な許可が必要になります。その辺りの話も機会があればまとめたいと思います。
- サービスロールについて、
"Condition"
要素でもう少し厳格に記述したい場合は以下の記事が詳しいです。
参考
Discussion