マルチアカウント環境における S3 バケットのレプリケーション設定方法

記事タイトルとURLをコピーする

カスタマーサクセス部 岡部です。

今年(2023年)の1月に S3 バケットが実質強制的に暗号化されるようになりました。

aws.amazon.com

このアップデートによるマルチアカウントでのレプリケーションへの影響がありそうだと思い、実際にやってみましたのでご紹介します。

はじめに

AWS Organizations を利用したマルチアカウント環境では各種ログはログアーカイブアカウントに集約することになりますが、ログアーカイブアカウントは Foundational OU に所属させログイン規制をかけるため、すべてのユーザーがログを確認できるわけではありません。
しかし、システム運用者がログを確認することは多々あり、何かしらの方法で運用者がログを確認できる形にしたいと思い、ログのレプリケーションを実装しました。

また、今回実装時に注意する必要があると感じた点は以下です。

  • SSE-S3 で暗号化していた場合でもマルチアカウントでレプリケートできる
  • レプリケート先のオブジェクトを消してしまうとバッチジョブでは再レプリケートできない

これらについて、詳細を含めて設定方法について説明いたします。

AWS 環境構成図

構成図は以下となります。


登場リソースは多くありませんが、S3 の他にレプリケート設定投入時に IAM Role が必要となります。

設定方法

前提条件

レプリケート設定をするために、両方の S3 でバージョニング機能を有効化する必要があります。 対象の S3 の「プロパティ」タブを確認して有効化されていない場合は、右上の「編集」から有効化にしてください。

1. レプリケーション元 S3 のバケットポリシー

レプリケーション元では IAM Role を利用してレプリケーションするため、S3 バケットポリシーに追記は不要となります。

2. レプリケーション元アカウントでの IAM Role 作成

先にお伝えしていた通り、レプリケーション設定の権限には IAM Role を利用します。
レプリケーションの設定をするときに自動で作成することもできますが、IAM Role 名を自分で決めたい場合は先に IAM Role を作っておきましょう。
また、IAM Role はレプリケーション設定ごとではなく、S3 バケットごとの設定となるので、複数のレプリケーションを設定する場合は注意が必要です。 許可ポリシー及び信頼されたエンティティを以下に記載します。

Permissions policies

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

Trusted entities

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "s3.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

初回レプリケーション(既存のオブジェクトのレプリケート)を実行したい場合はバッチ用IAMロールも作成してください。

3. レプリケーション先 S3 のバケットポリシー

レプリケーション先 S3 のバケットポリシーではレプリケーション元の IAM Role からのレプリケート操作を許可する必要があります。
バケットポリシーの例を以下に記載します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "allow to replicate",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::【アカウントID】:role/【IAM Role Name】"
                ]
            },
            "Action": [
                "s3:ReplicateDelete",
                "s3:ReplicateObject",
                "s3:ReplicateTags",
                "s3:ObjectOwnerOverrideToBucketOwner"
            ],
            "Resource": "arn:aws:s3:::【レプリケート先 S3 Name】/*"
        }
    ]
}

4. レプリケーション設定

それぞれでのアカウントで権限設定が完了したら、レプリケーション元の S3 でレプリケーション設定を進めます。
レプリケート元 S3 バケットの Management タブから Create replication rule を押下します。

Replication rule name は複数のレプリケートルールを作成することを考慮し、レプリケート先がわかるような名前が良いと思います。
Status は Rule を作成した時点でのレプリケーション設定です。すぐにレプリケートして問題ない場合は Enabled にします。
Priority は複数のレプリケートルールを作成した場合に必要な設定なので、今回はそのままとします。

Choose a rule scope で Limit the scope of this rule using one or more filters を選ぶことで、特定のパス(オブジェクト)のみをレプリケートすることができます。
今回は replicate-test 配下のディレクトリを指定しました。
タグでの制御も可能です。

Destination では Specify a bucket in another account を選択し、レプリケート先のアカウント ID およびバケット名を入力します。
Change object ownership to destination bucket owner にチェックをつけることで、バケットの所有権がレプリケート先のアカウントとなります。

IAM role は "Choose from existing IAM roles" を選択し、「2. レプリケーション元アカウントでの IAM Role 作成」で作成した IAM Role を指定します。
今回は SSE-S3 の暗号化を使用するので、Encryption にはチェックしません。
"Destination storage class" は必要に応じて変更してください。

今回は "Additional replication options" はスキップして、Save を押下します。

Save を押下すると、"Replicate existing objects?" と聞かれます。
今回は S3 を新規作成した想定で、オブジェクトは存在しないため No を選択します。
すでに存在しているオブジェクトをレプリケートしたい場合は、Yes を選択してジョブの作成に進んでください。

これでレプリケーション設定が完了しました。

レプリケート完了には遅延が発生しますので、実際にレプリケートされるまで少しお待ち下さい。 ほとんどの場合15分以内に完了しますが、長いとそれ以上かかることもあるようです。

おまけ. レプリケート設定後に間違ってレプリケート先の S3 オブジェクトを消してしまった場合の再レプリケート

結論からお伝えしますと、一度レプリケートされたオブジェクトを消してしまったら、再レプリケートすることはできません。 イメージ的には、改めてレプリケートのバッチジョブを実行すると消したオブジェクトを含め、レプリケート元 S3 と同様な状態になると思っていましたが、そうはなりませんでした。 もとに戻す方法としてはレプリケートではなく、コピージョブを使うことでコピーはできます。 レプリケート対象についての詳細は以下ドキュメントを御覧ください。

docs.aws.amazon.com

おわりに

本ブログでは、マルチアカウント環境における S3 バケットのレプリケーション方法についてご紹介しました。
S3 暗号化によるレプリケート設定への影響はほとんどないと考えて良いと思います。
一度消したオブジェクトを再レプリケートできない点と、今回詳細を触れていませんが複数のレプリケート設定を実装するときは IAM Role を複数選べない(共通の Role を使う)点にも、ご注意してください。

レプリケート設定は一度設定するとあまり変更する設定ではないと思うので、設定方法を忘れやすいので本ブログを参考にしていただけますと幸いです。

それでは、またお会いしましょう。

岡部 純 (記事一覧)

カスタマーサクセス部所属
AWS資格全冠取得