はじめに
Amazon S3 を使っている中で、他の AWS アカウント上にある S3 バケットのデータを利用したくなるときがあります。この時は、主に以下の3つの方法が利用可能です。
- S3 バケットのクロスアカウントレプリケーション
- バケットポリシーと IAM ポリシー
- スイッチロール
今回は、「S3 バケットのクロスアカウントレプリケーション」について、設定手順の確認をしていきます。
S3 バケットのクロスアカウントレプリケーションの概要図
まず概要図はこんな感じです。
左側にある AWS アカウント1のバケットに格納されたデータが、自動的に右側の AWS アカウント2 のバケットにコピーされます。データのコピーを行うことで、同じデータを双方に持つ形です。料金の観点だと、それぞれのバケットでデータを持つため、単純に料金がそれぞれ掛かってきます。
アカウント1 : S3 Bucket を準備する
レプリケーション対象の S3 Bucket を用意します。レプリケーションを開始したときに既にファイルが存在する場合、どういった挙動になるのか気になるので、2つのファイルを作成しています。
S3 レプリケーションを行うには、バージョニングの設定が必要です。デフォルトでは無効になっているので、有効にしていきます。
S3 Bucket の詳細ページにある Properties から、Edit を選択します。
Enable を選択して、Save changes を押します
有効になりました
アカウント2 : S3 Bucket を準備する
同様に、AWS アカウント 2 でもバケットを準備して、バージョニングを有効化します。
アカウント1 : IAM Role の作成
レプリケーションを行うために、IAM Role を作成していきます。IAM Role の作成画面で Custom trust policy を選択します。
次の trust policy を入力します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "s3.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
次に、作業を簡単にするために次の AmazonS3FullAccess
を選択します。実際の環境では、厳密な設定をしていくと良いでしょう。
コマかな設定を行う場合、例えば、このようなポリシーを組み立てます。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:ListBucket",
"s3:GetReplicationConfiguration",
"s3:GetObjectVersionForReplication",
"s3:GetObjectVersionAcl",
"s3:GetObjectVersionTagging",
"s3:GetObjectRetention",
"s3:GetObjectLegalHold"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::s3-replicaton-source01",
"arn:aws:s3:::s3-replicaton-source01/*",
"arn:aws:s3:::s3-replication-dest01",
"arn:aws:s3:::s3-replication-dest01/*"
]
},
{
"Action": [
"s3:ReplicateObject",
"s3:ReplicateDelete",
"s3:ReplicateTags",
"s3:ObjectOwnerOverrideToBucketOwner"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::s3-replicaton-source01/*",
"arn:aws:s3:::s3-replication-dest01/*"
]
}
]
}
IAM Role の名前を指定して保存します
作成されました。
アカウント2 : レプリケーション許可設定
次のを参照しながら、レプリケーション先の AWS アカウントで、レプリケーション許可のバケットポリシーを設定していきます。
Bucket Policy で Edit を押します。
AWS アカウント1 で作成した IAM Role の ARN に変更して、以下のJSON Policy を指定します。
{
"Version":"2012-10-17",
"Id":"PolicyForDestinationBucket",
"Statement":[
{
"Sid":"Permissions on objects",
"Effect":"Allow",
"Principal":{
"AWS":"arn:aws:iam::xxxxxxx:role/S3-Replication-Role"
},
"Action":[
"s3:ReplicateDelete",
"s3:ReplicateObject"
],
"Resource":"arn:aws:s3:::s3-replication-dest01/*"
},
{
"Sid":"Permissions on bucket",
"Effect":"Allow",
"Principal":{
"AWS":"arn:aws:iam::xxxxxxxx:role/S3-Replication-Role"
},
"Action": [
"s3:List*",
"s3:GetBucketVersioning",
"s3:PutBucketVersioning"
],
"Resource":"arn:aws:s3:::s3-replication-dest01"
}
]
}
アカウント1 : レプリケーションの設定
S3 Bucket の詳細ページで、Management から Create replication rule を選択します。
レプリケーションルールに好きな名前を指定できます
all-replicaton-to-another-account01
すべてのオブジェクトをレプリケーションの対象にします。プレフィックスなどを指定して、レプリケーション対象を指定することも可能です。
宛先の S3 Bucket を指定します。AWS アカウント2 側の アカウントID と バケット名を指定します。
アカウント1 で作成した IAM Role を指定します。
追加のオプション設定が出来ます。Metrics のみ有効にして Save を押します。
- Replication Time Control (RTC) : RTC を有効にすることで、ほとんどのオブジェクトは数秒でレプリケーションが完了します。99.99% のオブジェクトは 15 分以内にレプリケートします。
- Delete marker replication : チェックをオンにすると、レプリケート元での削除がれプリケート先に反映します
- Replica modification sync : タグや ACL などのメタデータレプリケーション設定
既に存在するオブジェクトもコピーするか聞かれるので、Submit を押します
既存のオブジェクトのコピーを有効化したため、Batch Operations の作成画面に遷移します。
Report の設定をしたうえで、Save を押します。
作成されました。
一定時間後、Batch Operation が処理されていることがわかります。この記事の環境では、4分ほどで処理が完了しました。
アカウント2 : 初期ファイル レプリケーション確認
レプリケーションを設定するときに、既に存在していたファイルが正常にレプリケーション先にコピーされているか確認します。AWS アカウント2 側の S3 Bucket を確認しましょう。
想定通り、正常にコピーされています。
アカウント1 : 新しくファイルをアップロード
初期のコピーが済んだので、新しくファイルをアップロードしてみましょう。まず、新しいファイルのアップロード前の状況です。
NewFile01.txt という名前のファイルをアップロードしました。
アカウント2 : レプリケーション確認
レプリケーション先の S3 Bucket に、正常にコピーされています!記事の環境では数秒でレプリケーションされていました。
検証を通じてわかったこと
- S3 Bucket のレプリケーション先は、異なるリージョンでも設定可能
- レプリケーション設定時に既に存在しているファイルも、レプリケーションの対象にすることが出来る
- Replication Time Control (RTC) を有効にすることで、ほとんどのオブジェクトは数秒でレプリケーションが完了する。99.99% のオブジェクトは 15 分以内にレプリケートと説明されている。
参考URL