S3バケットのクロスアカウントレプリケーションを試してみた

S3バケットのクロスアカウントレプリケーションを試してみました。
2022.06.16

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

データアナリティクス事業本部の笠原です。

今回はS3バケットのクロスアカウントレプリケーションを行なったので、設定方法をまとめてみました。

3行まとめ

  • 送信元、送信先バケットとも、S3バージョニングを有効化する
  • 送信元のバケットレプリケーションルールを設定する
  • 送信元のバケットレプリケーション実行IAMロールに対して、送信先のバケットポリシーにて適切な権限設定をする

バケット作成

送信元バケット、送信先バケットを事前に作成しておきます。

  • 同一リージョン (今回はap-northeast-1) で作成
  • バージョニング有効化
  • パブリックアクセスブロック有効化

送信元バケットのレプリケーション設定

送信元バケットの「管理」⇒「レプリケーションルール」から、レプリケーションルールを作成します。今回はこんな感じの設定です。

  • レプリケーションルール名: replication1
  • ステータス: 有効
  • ソースバケット
    • ルールスコープを選択: バケット内の全てのオブジェクトに適用
  • 送信先
    • 別のアカウントのバケットを指定する
      • 「アカウントID」と「送信先バケット名」を指定
      • 「オブジェクト所有者を送信先バケット所有者に変更」にチェックを入れる
  • IAMロール
    • 既存のロールから選択: 新しいロールの作成
  • 暗号化
    • 今回はデフォルトのチェックなしのままにします
      • KMS暗号化されたオブジェクトをレプリケートする場合はチェックを入れておきましょう
  • 送信先ストレージクラス
    • 今回はデフォルトのチェックなしのままにします
  • 追加のレプリケーションオプション
    • 今回は以下のオプションにチェック入れました
      • 「レプリケーション時間のコントロール (RTC)」にチェックを入れる

ルールを保存すると、既存オブジェクトをレプリケートするか尋ねられます。 今回はまだバケットにオブジェクトが何もないので、「いいえ、既存オブジェクトをレプリケートしません」を選択しておきます。

ルールを保存すると、レプリケーション用にIAMロールが作成されています。ポリシーはこんな感じでした。なお、IAMロールのARNをメモしておきましょう。この後、送信先バケットポリシーの設定で必要になります。

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

送信先バケットのバケットポリシー設定

送信元バケットにてレプリケーション設定したら、以下のように送信先バケットにバケットポリシーを設定しておきましょう。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<送信元アカウントID>:role/service-role/<送信元IAMロール>"
            },
            "Action": [
                "s3:ReplicateDelete",
                "s3:ReplicateObject",
                "s3:ReplicateTags",
                "s3:ObjectOwnerOverrideToBucketOwner"
            ],
            "Resource": "arn:aws:s3:::<送信先バケット>/*"
        }
    ]
}

動作確認

送信元バケットにファイルをアップロードします。しばらくすると、送信先バケットにファイルがレプリケートされていればOKです。

アップロード後レプリケートがなかなかされない場合は、送信元バケットのオブジェクトプロパティ内にあるレプリケーションステータスを確認しましょう。PENDINGならまだレプリケーションされる前の状態になりますし、FAILEDならレプリケーション失敗となります。設定内容を確認しましょう。

KMSを利用している場合は、送信元IAMロールがKMSキーにアクセスできていないケースがあるので、ロールのポリシー含め権限設定を見直してみましょう。

参考