Amazon S3 Tablesのレプリケーション機能を試してみた #AWSreInvent

Amazon S3 Tablesのレプリケーション機能を試してみた #AWSreInvent

2025.12.28

クラウド事業本部の石川です。AWS re:Invent 2024でAmazon S3 Tablesが発表されましたが、2025年12月にさらなるアップデートとしてレプリケーション機能Intelligent-Tieringのサポートが追加されました。

https://aws.amazon.com/jp/blogs/aws/announcing-replication-support-and-intelligent-tiering-for-amazon-s3-tables/

今回は、S3 Tablesのレプリケーション機能を実際に設定して、東京リージョン(ap-northeast-1)から大阪リージョン(ap-northeast-3)へのクロスリージョンレプリケーションを検証してみました。国内DR構成の構築に活用できる構成です。

https://dev.classmethod.jp/articles/20251202-amazon-s3-tables-replication/

S3 Tablesレプリケーションとは

S3 Tablesのレプリケーションは、Apache Icebergテーブルを異なるリージョンやアカウント間で自動的に複製する機能です。

主な特徴

  • クロスリージョンレプリケーション: 異なるAWSリージョン間でテーブルを複製
  • クロスアカウントレプリケーション: 異なるAWSアカウント間でテーブルを複製
  • マルチデスティネーション: 最大5つのデスティネーションへ同時複製
  • 読み取り専用レプリカ: レプリカテーブルは読み取り専用
  • 独立した保持期間: レプリカごとに異なるスナップショット保持期間を設定可能

アーキテクチャ概要

東京-大阪間のレプリケーションは、国内での災害復旧(DR)構成として非常に有効です。

レプリケーションの仕組み

レプリケーションを設定すると、S3 Tablesは以下の処理を自動的に実行します。

レプリケート対象

対象 説明
スナップショット コンパクション済み含むすべてのスナップショット
データファイル Parquet等のデータファイル
メタデータ Icebergメタデータファイル
スキーマ情報 現在および履歴のスキーマ
パーティション仕様 テーブルのパーティション定義

やってみた

それでは実際にレプリケーションを設定してみましょう!

前提条件

  • AWS CLI v2.22.10以上
  • S3 Tablesが利用可能なリージョン
    • 東京リージョン(ap-northeast-1)
    • 大阪リージョン(ap-northeast-3)

検証構成

Step 1: テーブルバケットの作成

まず、ソースとデスティネーションのテーブルバケットを作成します。

# ソーステーブルバケットの作成(東京リージョン)
aws s3tables create-table-bucket \
  --name cm-tokyo-source-bucket \
  --region ap-northeast-1

# デスティネーションテーブルバケットの作成(大阪リージョン)
aws s3tables create-table-bucket \
  --name cm-osaka-destination-bucket \
  --region ap-northeast-3

実行結果:

~ $ aws s3tables create-table-bucket \
>   --name cm-tokyo-source-bucket \
>   --region ap-northeast-1
{
    "arn": "arn:aws:s3tables:ap-northeast-1:123456789012:bucket/cm-tokyo-source-bucket"
}

~ $ aws s3tables create-table-bucket \
>   --name cm-osaka-destination-bucket \
>   --region ap-northeast-3
{
    "arn": "arn:aws:s3tables:ap-northeast-3:123456789012:bucket/cm-osaka-destination-bucket"
}

Step 2: IAMロールの作成

レプリケーションを実行するためのIAMロールを作成します。

IAMロール(信頼ポリシー)の作成

レプリケーションを実行するため、Principalreplication.s3tables.amazonaws.com を指定したIAMロールを作成します。、S3 Tablesレプリケーションサービスがこのロールを引き受けることができます。

aws iam create-role \
  --role-name S3TablesReplicationRole \
  --assume-role-policy-document '{
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Principal": {
          "Service": "replication.s3tables.amazonaws.com"
        },
        "Action": "sts:AssumeRole"
      }
    ]
  }' \
  --description "Role for S3 Tables replication (Tokyo to Osaka)"

レプリケーション権限ポリシーの作成

レプリケーション権限ポリシーは、長いのでreplication-permissions.json を作成します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "SourceBucketReadPermissions",
      "Effect": "Allow",
      "Action": [
        "s3tables:GetTable",
        "s3tables:GetTableMetadataLocation",
        "s3tables:GetTableMaintenanceConfiguration",
        "s3tables:GetTableData"
      ],
      "Resource": "arn:aws:s3tables:ap-northeast-1:123456789012:bucket/cm-tokyo-source-bucket/table/*"
    },
    {
      "Sid": "SourceBucketListPermissions",
      "Effect": "Allow",
      "Action": [
        "s3tables:ListTables"
      ],
      "Resource": "arn:aws:s3tables:ap-northeast-1:123456789012:bucket/cm-tokyo-source-bucket"
    },
    {
      "Sid": "DestinationBucketCreatePermissions",
      "Effect": "Allow",
      "Action": [
        "s3tables:CreateTable",
        "s3tables:CreateNamespace"
      ],
      "Resource": "arn:aws:s3tables:ap-northeast-3:123456789012:bucket/cm-osaka-destination-bucket"
    },
    {
      "Sid": "DestinationTableWritePermissions",
      "Effect": "Allow",
      "Action": [
        "s3tables:PutTableData",
        "s3tables:GetTableData",
        "s3tables:UpdateTableMetadataLocation",
        "s3tables:PutTableMaintenanceConfiguration"
      ],
      "Resource": "arn:aws:s3tables:ap-northeast-3:123456789012:bucket/cm-osaka-destination-bucket/table/*"
    }
  ]
}

レプリケーション権限ポリシーをS3TablesReplicationRoleロールにアタッチします。

aws iam put-role-policy \
  --role-name S3TablesReplicationRole \
  --policy-name S3TablesReplicationPermissions \
  --policy-document file://replication-permissions.json

作成したレプリケーションの実行ロールは以下のとおりです。

20251228-s3-tables-replication-1

Step 3: ソーステーブルの作成

ネームスペースとテーブルを作成します。

# ネームスペースの作成
aws s3tables create-namespace \
  --table-bucket-arn arn:aws:s3tables:ap-northeast-1:123456789012:bucket/cm-tokyo-source-bucket \
  --namespace analytics

# テーブルの作成
aws s3tables create-table \
  --table-bucket-arn arn:aws:s3tables:ap-northeast-1:123456789012:bucket/cm-tokyo-source-bucket \
  --namespace analytics \
  --name sales_data \
  --format ICEBERG \
  --metadata '{
    "iceberg": {
      "schema": {
        "fields": [
          {"name": "id", "type": "int", "required": true},
          {"name": "product_name", "type": "string"},
          {"name": "quantity", "type": "int"},
          {"name": "price", "type": "double"},
          {"name": "sale_date", "type": "date"}
        ]
      }
    }
  }'

ネームスペースとテーブルが作成されました。

~ $ aws s3tables create-namespace \
>   --table-bucket-arn arn:aws:s3tables:ap-northeast-1:123456789012:bucket/cm-tokyo-source-bucket \
>   --namespace analytics

{
    "tableBucketARN": "arn:aws:s3tables:ap-northeast-1:123456789012:bucket/cm-tokyo-source-bucket",
    "namespace": [
        "analytics"
    ]
}

~ $ aws s3tables create-table \
>   --table-bucket-arn arn:aws:s3tables:ap-northeast-1:123456789012:bucket/cm-tokyo-source-bucket \
>   --namespace analytics \
>   --name sales_data \
>   --format ICEBERG \
>   --metadata '{
>     "iceberg": {
>       "schema": {
>         "fields": [
>           {"name": "id", "type": "int", "required": true},
>           {"name": "product_name", "type": "string"},
>           {"name": "quantity", "type": "int"},
>           {"name": "price", "type": "double"},
>           {"name": "sale_date", "type": "date"}
>         ]
>       }
>     }
>   }'

{
    "tableARN": "arn:aws:s3tables:ap-northeast-1:123456789012:bucket/cm-tokyo-source-bucket/table/b27a5c38-705c-488f-9ca3-1e30d2436450",
    "versionToken": "ebeb53dc7d1835ed7ffe"
}

作成したソーステーブル(sales_data)は以下のとおりです。

20251228-s3-tables-replication-2

20251228-s3-tables-replication-3

Step 4: レプリケーションの設定

レプリケーションを設定します。

ソーステーブル(sales_data)テーブルARNの取得

注意が必要なのは、Amazon S3 Tables(特にReplication設定)で使用するテーブルARNは、「階層構造」ではなく「リソースID」 ベースである点です。具体的には、table の後に名前空間(Namespace)を / で繋ぐのではなく、ドット . 形式や特定のリソースID形式のため、テーブルARNを取得します。

aws s3tables list-tables --table-bucket-arn arn:aws:s3tables:ap-northeast-1:123456789012:bucket/cm-tokyo-source-bucket

tableARNを確認します。(下記の"arn:aws:s3tables:ap-northeast-1:123456789012:bucket/cm-tokyo-source-bucket/table/b27a5c38-705c-488f-9ca3-1e30d2436450"の部分)

~ $ aws s3tables list-tables --table-bucket-arn arn:aws:s3tables:ap-northeast-1:123456789012:bucket/cm-tokyo-source-bucket
{
    "tables": [
        {
            "namespace": [
                "analytics"
            ],
            "name": "sales_data",
            "type": "customer",
            "tableARN": "arn:aws:s3tables:ap-northeast-1:123456789012:bucket/cm-tokyo-source-bucket/table/b27a5c38-705c-488f-9ca3-1e30d2436450",
            "createdAt": "2025-12-28T11:33:47.356341+00:00",
            "modifiedAt": "2025-12-28T11:33:47.356341+00:00"
        }
    ]
}

テーブルレベルレプリケーションの設定

上記のtableARNを指定して実行します。

aws s3tables put-table-replication \
  --table-arn "arn:aws:s3tables:ap-northeast-1:123456789012:bucket/cm-tokyo-source-bucket/table/b27a5c38-705c-488f-9ca3-1e30d2436450" \
  --configuration '{
    "role": "arn:aws:iam::123456789012:role/S3TablesReplicationRole",
    "rules": [
      {
        "destinations": [
          {
            "destinationTableBucketARN": "arn:aws:s3tables:ap-northeast-3:123456789012:bucket/cm-osaka-destination-bucket"
          }
        ]
      }
    ]
  }'

実行結果:

~ $ aws s3tables put-table-replication \
>   --table-arn "arn:aws:s3tables:ap-northeast-1:123456789012:bucket/cm-tokyo-source-bucket/table/b27a5c38-705c-488f-9ca3-1e30d2436450" \
>   --configuration '{
>     "role": "arn:aws:iam::123456789012:role/S3TablesReplicationRole",
>     "rules": [
>       {
>         "destinations": [
>           {
>             "destinationTableBucketARN": "arn:aws:s3tables:ap-northeast-3:123456789012:bucket/cm-osaka-destination-bucket"
>           }
>         ]
>       }
>     ]
>   }'
{
    "versionToken": "b5dfca54f0483132e841",
    "status": "success"
}

成功するとsuccessが確認できます。レプリケーションが設定されました。

Step 5: レプリケーションステータスの確認

レプリケーションが正常に動作しているか確認してみましょう。

aws s3tables get-table-replication \
  --table-arn "arn:aws:s3tables:ap-northeast-1:123456789012:bucket/cm-tokyo-source-bucket/table/b27a5c38-705c-488f-9ca3-1e30d2436450"

実行結果:

~ $ aws s3tables get-table-replication \
>   --table-arn "arn:aws:s3tables:ap-northeast-1:123456789012:bucket/cm-tokyo-source-bucket/table/b27a5c38-705c-488f-9ca3-1e30d2436450"
{
    "versionToken": "b5dfca54f0483132e841",
    "configuration": {
        "role": "arn:aws:iam::123456789012:role/S3TablesReplicationRole",
        "rules": [
            {
                "destinations": [
                    {
                        "destinationTableBucketARN": "arn:aws:s3tables:ap-northeast-3:123456789012:bucket/cm-osaka-destination-bucket"
                    }
                ]
            }
        ]
    }
}

マネジメントコンソール(東京リージョン)からも確認してみます。

20251228-s3-tables-replication-4

Step 6: デスティネーションでのレプリカ確認

数分待ってから、大阪リージョンでレプリカテーブルを確認します。

aws s3tables list-tables \
  --table-bucket-arn arn:aws:s3tables:ap-northeast-3:123456789012:bucket/cm-osaka-destination-bucket \
  --namespace analytics \
  --region ap-northeast-3

実行結果:

~ $ aws s3tables list-tables \
>   --table-bucket-arn arn:aws:s3tables:ap-northeast-3:123456789012:bucket/cm-osaka-destination-bucket \
>   --namespace analytics \
>   --region ap-northeast-3
{
    "tables": [
        {
            "namespace": [
                "analytics"
            ],
            "name": "sales_data",
            "type": "customer",
            "tableARN": "arn:aws:s3tables:ap-northeast-3:123456789012:bucket/cm-osaka-destination-bucket/table/177d6ede-c8dc-44a8-ae2a-5fcd64c8349b",
            "createdAt": "2025-12-28T12:25:34.354241+00:00",
            "modifiedAt": "2025-12-28T12:35:18.819673+00:00",
            "managedByService": "replication.s3tables.amazonaws.com"
        }
    ]
}

マネジメントコンソール(大阪リージョン)からも確認してみます。

20251228-s3-tables-replication-5

Step 7: Athenaからクエリしてみる

補足: Athenaからクエリするためには、Lake Formationでカタログとすべてのテーブルに対する権限を付与しています。この解説をすると更に長くなるので省略します。

レプリカテーブルにAthenaからクエリを実行してデータが同期されているか、何分でレプリケーションされるかについて確認します。

初期状態は、ソーステーブル(東京リージョン)にレコードが入っていないので、デスティネーションテーブル(大阪)にもレコードが入っていない状態です。

1レコードINSERT(最初)

ソーステーブル(東京リージョン)にレコードをINSERTする。

20251228-s3-tables-replication-6

すると、Replication statusPendingとなる。

20251228-s3-tables-replication-7

約6分後にデスティネーションテーブル(大阪)でレコードが参照できました。そして、数秒後に上記のReplication statusCompletedとなりました。

20251228-s3-tables-replication-8

1レコードINSERT(2回目)

ソーステーブル(東京リージョン)にレコードをINSERTすると、Replication statusPendingとなる。約10分後にデスティネーションテーブル(大阪)でレコードが参照できました。そして、数秒後に上記のReplication statusCompletedとなりました。

1レコードINSERT(3回目)

ソーステーブル(東京リージョン)にレコードをINSERTすると、Replication statusPendingとなる。約7分後にデスティネーションテーブル(大阪)でレコードが参照できました。そして、数秒後に上記のReplication statusCompletedとなりました。

リプリケーション時間の比較

リプリケーションは、初回は約6分、2回目は約10分、3回目は約7分と、同期するまでの時間が一定ではないようです。ソーステープルに変更を加えるとReplication statusがすぐに同期的に反映されましたが、変更がリプリケーションされるのは同期的ではないようです。

バケットレベルレプリケーションも試してみた

テーブル単位ではなく、バケット内の全テーブルにレプリケーションを適用したい場合は、バケットレベルレプリケーションを使用します。

バケットレベルレプリケーション設定を適用します。

aws s3tables put-table-bucket-replication \
  --table-bucket-arn arn:aws:s3tables:ap-northeast-1:123456789012:bucket/cm-tokyo-source-bucket \
  --configuration '{
    "role": "arn:aws:iam::123456789012:role/S3TablesReplicationRole",
    "rules": [
      {
        "destinations": [
          {
            "destinationTableBucketARN": "arn:aws:s3tables:ap-northeast-3:123456789012:bucket/cm-osaka-destination-bucket"
          }
        ]
      }
    ]
  }'

実行結果:

~ $ aws s3tables put-table-bucket-replication \
>   --table-bucket-arn arn:aws:s3tables:ap-northeast-1:123456789012:bucket/cm-tokyo-source-bucket \
>   --configuration '{
>     "role": "arn:aws:iam::123456789012:role/S3TablesReplicationRole",
>     "rules": [
>       {
>         "destinations": [
>           {
>             "destinationTableBucketARN": "arn:aws:s3tables:ap-northeast-3:123456789012:bucket/cm-osaka-destination-bucket"
>           }
>         ]
>       }
>     ]
>   }'
{
    "versionToken": "f845286ff5e997c3b5a1",
    "status": "success"
}

20251228-s3-tables-replication-11

ソース(東京リージョン)となるデータベース(anlytics)にテーブル(users_data)を作成して、1レコード追加しました。

20251228-s3-tables-replication-9

ディスタネーション(大阪リージョン)となるデータベース(anlytics)に数行でテーブル(users_data)を作成されましたが、レコードは追加されずReplication statusPendingとなりました。

約7分後にデスティネーションテーブル(大阪)でレコードが参照できました。そして、数秒後に上記のReplication statusCompletedとなりました。

バケット内のすべての既存テーブルと、今後作成される新しいテーブルが自動的にレプリケートされることも確認できました。

ソーステーブルsales_data(東京リージョン)の削除

ディザスタリカバリの観点で、ソーステーブルsales_data(東京リージョン)を削除した場合の挙動を確認したいと思います。

Amazon Athenaでテーブルを削除しました。

20251228-s3-tables-replication-10

ソーステーブルsales_data(東京リージョン)するとS3 Tablesの一覧からも直ちに削除されました。しかし、ディスタネーション(大阪リージョン)ではなかなか消えません。40分経っても削除されない。後で書きます→ 削除されるのは、約?分後でした。

いずれにしても、ディスタネーション(大阪リージョン)は読み取り専用なので、大阪をマスタにしたい場合は、東京のテーブルが削除される前に、大阪で別テーブルをコピーする必要があります。

制限事項と注意点

検証中に気づいた制限事項をまとめておきます。

主な制限事項

項目 制限
レプリカの書き込み 読み取り専用(書き込み不可)
最大デスティネーション数 5つまで
ルール数 1ルールのみ
コンパクション レプリカテーブルでは実行不可
メタデータサイズ 500MB超は非対応
Icebergバージョン更新 V2→V3にアップグレードしたテーブルはレプリケート不可
タグ/ブランチ タグやブランチを持つテーブルは非対応

ハマりポイント

  1. IAMロールの信頼ポリシー: replication.s3tables.amazonaws.com を指定し忘れるとレプリケーションが開始されません
  2. レプリケーション遅延: 通常は7〜10分程度ですが、大量のデータ更新後は時間がかかる可能性がある
  3. DDLの同期: Amazon Athenaでテーブルを削除してもディスタネーションはすぐに削除されない。リプリケーションを止めたい場合は、リプリケーションする。

ユースケース

東京-大阪間のS3 Tablesレプリケーションは以下のようなユースケースに適しています。

料金について

S3 Tablesのレプリケーションには以下の料金が発生します。

  • ストレージ料金: ソース(東京)とレプリカ(大阪)の両方に課金
  • データ転送料金: 東京-大阪間のリージョン間転送料金が発生
  • リクエスト料金: レプリケーションに伴うAPI呼び出し

Intelligent-Tieringと組み合わせることで、レプリカ側のストレージコストを最適化できます。

最後に

S3 Tablesのレプリケーション機能を使って、東京-大阪間のクロスリージョンレプリケーションを試してみました。

  • 設定は簡単: CLIまたはコンソールから数ステップで設定可能
  • 自動複製: スナップショット、データ、メタデータがすべて自動的に複製される
  • 柔軟な構成: テーブル単位/バケット単位、最大5デスティネーション
  • 独立した保持期間: レプリカには異なるスナップショット保持期間を設定可能
  • 国内DR構成: 東京-大阪間で国内完結のDR構成が構築可能

データレイクハウスにおける国内DR構成、分析ワークロードの分離、コンプライアンス対応などのユースケースに非常に有用な機能だと感じました。

合わせて読みたい

https://aws.amazon.com/jp/blogs/news/announcing-replication-support-and-intelligent-tiering-for-amazon-s3-tables/

この記事をシェアする

FacebookHatena blogX

関連記事