【AWS】SSE-S3で暗号化したS3バケットをクロスアカウント&クロスリージョンでレプリケーションする方法
AWSでシステムを運用する際、データ保護やBCP(事業継続計画)対策として、「別のアカウント(クロスアカウント)」かつ「別のリージョン(クロスリージョン)」のS3バケットへデータを自動複製(レプリケーション)したいというケースはよくあります。
今回は、Amazon S3の標準暗号化である「SSE-S3(Amazon S3管理の暗号化キー)」で暗号化されたオブジェクトを、別アカウントのS3バケットへレプリケーションする手順を、実際のIAMポリシーやバケットポリシーのコード付きで徹底解説します!
記事の目次
前提条件と今回の構成
今回は以下の環境を想定して設定を進めます。
| 項目 | 送信元(AWSアカウント1:Source) | 送信先(AWSアカウント2:Destination) |
| アカウントID | <AWS1のアカウントID> | 215398796763 |
| リージョン | 東京(ap-northeast-1)など | 欧州(eu-west-1) |
| S3バケット名 | <source-s3-bucket-name> | distination-s3-bucket-215398796763-eu-west-1-an |
今回、送信先バケット名をうっかり destination ではなく distination(iになっている)と作成してしまいました(笑)。本記事ではこのタイポしたバケット名のまま進めますが、皆様が試す際は適宜ご自身のバケット名に読み替えてください!
Step 1. 【AWSアカウント2】送信先(Destination)S3バケットの作成
まずは、レプリケーションの受け皿となる送信先(AWSアカウント2)のS3バケットを作成します。
AWSアカウント2にログインし、S3コンソールを開きます。
バケット名 distination-s3-bucket-215398796763-eu-west-1-an でバケットを作成します。
特記事項は特にないですが、 レプリケーションを行うため、「バケットのバージョニング」を有効に設定してください。
暗号化はデフォルトの「SSE-S3」のままでOKです。現時点ではバケットポリシーの編集は不要です。
Step 2. 【AWSアカウント1】送信元(Source)でのIAMロールとポリシー作成
次に、送信元(AWSアカウント1)側で、S3がオブジェクトを別アカウントにコピーするための「IAMロール」と「許可ポリシー」を作成します。
IAMポリシーの作成
IAMコンソールで、以下の内容でカスタムポリシーを作成します。ポリシー名は分かりやすい名前(例:s3-cross-replication-policy など)にしてください。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetReplicationConfiguration",
"s3:ListBucket"
],
"Resource": "<source S3バケットARN>"
},
{
"Effect": "Allow",
"Action": [
"s3:GetObjectVersionForReplication",
"s3:GetObjectVersionAcl",
"s3:GetObjectVersionTagging"
],
"Resource": "<source S3バケットARN>/*"
},
{
"Effect": "Allow",
"Action": [
"s3:ReplicateObject"
],
"Resource": "<destination S3 バケットARN>/*"
},
{
"Effect": "Allow",
"Action": [
"s3:ReplicateDelete",
"s3:ReplicateTags"
],
"Resource": [
"<destination S3 バケットARN>",
"<destination S3 バケットARN>/*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:ObjectOwnerOverrideToBucketOwner"
],
"Resource": "<destination S3 バケットARN>"
}
]
}IAMロールの作成
続いて、S3サービスがこのロールを使用できるように、信頼ポリシー(Trust Relationship)を設定したIAMロールを作成します。ロール名は「s3-cross-replication-role」にします。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "s3.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}許可は先ほど作成したポリシーをアタッチして作成します。
最終的には下記の通り
許可ポリシー
信頼ポリシー
Step 3. 【AWSアカウント1】S3レプリケーションルールの設定
S3のソースバケットの詳細へ移動し「管理」タブをクリックし「レプリケーションルールを作成」をクリック
※レプリケーションルールがすでに作成されてありますが、おそらく最初は何も設定されていないはずです。
- 送信元S3バケットの詳細画面へ移動し、「管理」タブをクリックします。
- 「レプリケーションルール」セクションから、「レプリケーションルールを作成」をクリックします。
- 以下の通り設定を行います。
- ルール名: 任意の名前を入力
- ソースバケット: 「バケット内のすべてのオブジェクトに適用」を選択
- 送信先:
- 「別の AWS アカウントのバケットを指定する」を選択
- アカウントID: 215398796763
- バケット名: distination-s3-bucket-215398796763-eu-west-1-an
- 重要: 「オブジェクト所有者を送信先バケット所有者に変更」にチェックを入れる(これを忘れると、送信先アカウントでファイルが開けなくなります)
- IAMロール: 先ほど作成した s3-cross-replication-role を指定
- 暗号化: 今回は「SSE-S3」での暗号化のため、追加の暗号化設定(AWS KMSのチェックなど)は不要です。
設定後、保存します。「レプリケーションルール > 詳細の表示」から、設定が正しく反映されているか最終確認をしてください。
下記設定は任意で設定
Step 4. 【AWSアカウント2】送信先S3バケットポリシーの更新
クロスアカウントでのレプリケーションを成功させるには、送信先(AWSアカウント2)のバケット側でも「受け入れ許可」が必要です。
AWSアカウント2にログインし、送信先S3バケットの「アクセス許可」タブに移動します。
「バケットポリシーの編集」を開き、以下のポリシーを追記して保存します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "MinimalReplication",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<AWS1のアカウントID>:role/s3-cross-replication-role"
},
"Action": [
"s3:ReplicateObject",
"s3:ReplicateDelete",
"s3:ReplicateTags"
],
"Resource": "arn:aws:s3:::distination-s3-bucket-<アカウントID>-eu-west-1-an/*"
}
]
}これで全ての紐付けが完了しました!
動作テスト:レプリケーションされるか確認してみよう
設定が完了したら、実際に動くかテストしてみましょう。
- AWSアカウント1(送信元)のS3バケットに、適当なテストファイルをアップロードします。
- しばらく待ってから(※リージョン間移動のため数秒〜数分かかる場合があります)、AWSアカウント2(送信先)のS3バケットを確認します。
- 無事にファイルが複製されていれば、クロスアカウント・クロスリージョンのS3レプリケーションは成功です!
AWS1
AWS2
まとめ:SSE-S3なら設定もシンプル!
今回はSSE-S3で暗号化されたバケットのクロスアカウントレプリケーションを解説しました。
AWS KMS(SSE-KMS)を使った暗号化の場合、キーポリシーの編集などステップがさらに増えて複雑になりますが、SSE-S3であれば追加の暗号化権限を考慮しなくてよいため、非常にシンプルに実装できます。
「別アカウントへのバックアップを行いたい」という方は、ぜひ本記事のポリシーを参考に設定してみてください。バケット名のタイポ(destination と distination)には気をつけましょうね!