ヘヴィメタル・エンジニアリング

AWS特化型エンジニアのほのぼのヘヴィメタルブログ

ヘヴィメタル・エンジニアリング

クラウド特化型ヘヴィメタルエンジニアのほのぼのブログ

アカウント間S3レプリケーションのやり方

はじめに

よくAWSに触れるものです。

複数AWS環境を持っている方で、S3バケット内のオブジェクトデータを移したいと思うことはよくあるのではないでしょうか。

そんなときに、スタンダードなやり方としては$ aws s3 sync$ aws s3 cpを使うかと思うのですが、それだといちいちコマンドを打つのがめんどくさいですし、そもそも膨大なオブジェクトデータが存在しているとかなりの時間がかかります。

そんなときはS3のレプリケーション機能を使いましょう。

S3レプリケーション機能はレプリケート元バケットに新しくオブジェクトが追加されると、レプリケート先S3バケットにもオブジェクトが再現されます。

今回はそんな便利なS3のレプリケーション機能について実践します。

導入

まずドキュメントでS3レプリケーションについてのドキュメントを読んだときに、

あれ?レプリケートって言葉はどっち方向の言葉?レプリケート元ってどっち?

てなることがあるかなと思います。

なので、以下のような図を用意したので、そちらを参考にしてください。

f:id:xkenshirou:20210212191505p:plain

手順

それでは早速、実践していきましょう。

1. S3バケットのバージョニングを有効にする

レプリケート元、先バケットのバージョニングを有効にしましょう。

2. レプリケート元バケットレプリケーションルールを作成

バケットの管理からレプリケーションルールの作成を選択します。

f:id:xkenshirou:20210212191921p:plain

ここでは

  • 適当なルール名を入力
  • ルールスコープはすべてのオブジェクトを選択
  • 送信先でレプリケート先アカウントを指定 ※ この際、オブジェクト所有者を送信先バケット所有者に変更を選択してください
  • IAMロールを付与

の用に設定を行います。

IAMロールはここで自動作成しても良いです。

以下のポリシーを持ったロールを作成しましょう。

{
    "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:::<レプリケート先バケット名>",
                "arn:aws:s3:::<レプリケート先バケット名>/*"
            ]
        },
        {
            "Action": [
                "s3:ReplicateObject",
                "s3:ReplicateDelete",
                "s3:ReplicateTags",
                "s3:ObjectOwnerOverrideToBucketOwner"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::<レプリケート先バケット名>/*",
                "arn:aws:s3:::<レプリケート先バケット名>/*"
            ]
        }
    ]
}

3. レプリケート先バケットバケットポリシーを追加する

以下のようなバケットポリシーを追加します。

{
    "Version": "2008-10-17",
    "Id": "",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<account-id>:role/<レプリケーションルールに付与したロール名>"
            },
            "Action": [
                "s3:ReplicateObject",
                "s3:ReplicateDelete"
            ],
            "Resource": "arn:aws:s3:::<このポリシーを追加しているバケット名>/*"
        },
        {
            "Sid": "2",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<account-id>:role/service-role/<レプリケーションルールに付与したロール名>"
            },
            "Action": [
                "s3:GetBucketVersioning",
                "s3:PutBucketVersioning"
            ],
            "Resource": "arn:aws:s3:::<このポリシーを追加しているバケット名>"
        }
        {
            "Sid": "3",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<account-id>:root"
            },
            "Action": "s3:ObjectOwnerOverrideToBucketOwner",
            "Resource": "arn:aws:s3:::<このポリシーを追加しているバケット名>/*"
        }
    ]
}

この際、Sid: 3のポリシーが無いと、オブジェクトの所有権をレプリケート先バケットにすることができないので注意しましょう。

これでレプリケーションの設定は完了なので、実際にレプリケート元バケットにオブジェクトを保存して、レプリケート先バケットに再現されるか試してみましょう。

おわりに

AWSのストアやストレージ系のレプリケーション機能については以前もこちらで紹介しています。

xkenshirou.hatenablog.com

レプリケーション機能は他にもECRにも存在しているので、今度そちらにも触れようと思います。

参考

レプリケーション設定方法
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/user-guide/enable-replication.html

アカウント間レプリケーションの設定方法
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/replication-walkthrough-2.html

レプリケーションする際のオブジェクト所有権を移す
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/replication-change-owner.html