【AWS】SSE-S3で暗号化した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のソースバケットの詳細へ移動し「管理」タブをクリックし「レプリケーションルールを作成」をクリック

※レプリケーションルールがすでに作成されてありますが、おそらく最初は何も設定されていないはずです。

  1. 送信元S3バケットの詳細画面へ移動し、「管理」タブをクリックします。
  2. 「レプリケーションルール」セクションから、「レプリケーションルールを作成」をクリックします。
  3. 以下の通り設定を行います。
  • ルール名: 任意の名前を入力
  • ソースバケット: 「バケット内のすべてのオブジェクトに適用」を選択
  • 送信先:
    • 「別の 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/*"
        }
    ]
}

これで全ての紐付けが完了しました!

動作テスト:レプリケーションされるか確認してみよう

設定が完了したら、実際に動くかテストしてみましょう。

  1. AWSアカウント1(送信元)のS3バケットに、適当なテストファイルをアップロードします。
  2. しばらく待ってから(※リージョン間移動のため数秒〜数分かかる場合があります)、AWSアカウント2(送信先)のS3バケットを確認します。
  3. 無事にファイルが複製されていれば、クロスアカウント・クロスリージョンのS3レプリケーションは成功です!

AWS1

AWS2

まとめ:SSE-S3なら設定もシンプル!

今回はSSE-S3で暗号化されたバケットのクロスアカウントレプリケーションを解説しました。

AWS KMS(SSE-KMS)を使った暗号化の場合、キーポリシーの編集などステップがさらに増えて複雑になりますが、SSE-S3であれば追加の暗号化権限を考慮しなくてよいため、非常にシンプルに実装できます。

「別アカウントへのバックアップを行いたい」という方は、ぜひ本記事のポリシーを参考に設定してみてください。バケット名のタイポ(destinationdistination)には気をつけましょうね!