
Amazon S3 Tablesのレプリケーション機能を試してみた #AWSreInvent
クラウド事業本部の石川です。AWS re:Invent 2024でAmazon S3 Tablesが発表されましたが、2025年12月にさらなるアップデートとしてレプリケーション機能とIntelligent-Tieringのサポートが追加されました。
今回は、S3 Tablesのレプリケーション機能を実際に設定して、東京リージョン(ap-northeast-1)から大阪リージョン(ap-northeast-3)へのクロスリージョンレプリケーションを検証してみました。国内DR構成の構築に活用できる構成です。
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ロール(信頼ポリシー)の作成
レプリケーションを実行するため、Principal に replication.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
作成したレプリケーションの実行ロールは以下のとおりです。

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)は以下のとおりです。


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"
}
]
}
]
}
}
マネジメントコンソール(東京リージョン)からも確認してみます。

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"
}
]
}
マネジメントコンソール(大阪リージョン)からも確認してみます。

Step 7: Athenaからクエリしてみる
補足: Athenaからクエリするためには、Lake Formationでカタログとすべてのテーブルに対する権限を付与しています。この解説をすると更に長くなるので省略します。
レプリカテーブルにAthenaからクエリを実行してデータが同期されているか、何分でレプリケーションされるかについて確認します。
初期状態は、ソーステーブル(東京リージョン)にレコードが入っていないので、デスティネーションテーブル(大阪)にもレコードが入っていない状態です。
1レコードINSERT(最初)
ソーステーブル(東京リージョン)にレコードをINSERTする。

すると、Replication statusがPendingとなる。

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

1レコードINSERT(2回目)
ソーステーブル(東京リージョン)にレコードをINSERTすると、Replication statusがPendingとなる。約10分後にデスティネーションテーブル(大阪)でレコードが参照できました。そして、数秒後に上記のReplication statusがCompletedとなりました。
1レコードINSERT(3回目)
ソーステーブル(東京リージョン)にレコードをINSERTすると、Replication statusがPendingとなる。約7分後にデスティネーションテーブル(大阪)でレコードが参照できました。そして、数秒後に上記のReplication statusがCompletedとなりました。
リプリケーション時間の比較
リプリケーションは、初回は約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"
}

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

ディスタネーション(大阪リージョン)となるデータベース(anlytics)に数行でテーブル(users_data)を作成されましたが、レコードは追加されずReplication statusがPendingとなりました。
約7分後にデスティネーションテーブル(大阪)でレコードが参照できました。そして、数秒後に上記のReplication statusがCompletedとなりました。
バケット内のすべての既存テーブルと、今後作成される新しいテーブルが自動的にレプリケートされることも確認できました。
ソーステーブルsales_data(東京リージョン)の削除
ディザスタリカバリの観点で、ソーステーブルsales_data(東京リージョン)を削除した場合の挙動を確認したいと思います。
Amazon Athenaでテーブルを削除しました。

ソーステーブルsales_data(東京リージョン)するとS3 Tablesの一覧からも直ちに削除されました。しかし、ディスタネーション(大阪リージョン)ではなかなか消えません。40分経っても削除されない。後で書きます→ 削除されるのは、約?分後でした。
いずれにしても、ディスタネーション(大阪リージョン)は読み取り専用なので、大阪をマスタにしたい場合は、東京のテーブルが削除される前に、大阪で別テーブルをコピーする必要があります。
制限事項と注意点
検証中に気づいた制限事項をまとめておきます。
主な制限事項
| 項目 | 制限 |
|---|---|
| レプリカの書き込み | 読み取り専用(書き込み不可) |
| 最大デスティネーション数 | 5つまで |
| ルール数 | 1ルールのみ |
| コンパクション | レプリカテーブルでは実行不可 |
| メタデータサイズ | 500MB超は非対応 |
| Icebergバージョン更新 | V2→V3にアップグレードしたテーブルはレプリケート不可 |
| タグ/ブランチ | タグやブランチを持つテーブルは非対応 |
ハマりポイント
- IAMロールの信頼ポリシー:
replication.s3tables.amazonaws.comを指定し忘れるとレプリケーションが開始されません - レプリケーション遅延: 通常は7〜10分程度ですが、大量のデータ更新後は時間がかかる可能性がある
- DDLの同期: Amazon Athenaでテーブルを削除してもディスタネーションはすぐに削除されない。リプリケーションを止めたい場合は、リプリケーションする。
ユースケース
東京-大阪間のS3 Tablesレプリケーションは以下のようなユースケースに適しています。
料金について
S3 Tablesのレプリケーションには以下の料金が発生します。
- ストレージ料金: ソース(東京)とレプリカ(大阪)の両方に課金
- データ転送料金: 東京-大阪間のリージョン間転送料金が発生
- リクエスト料金: レプリケーションに伴うAPI呼び出し
Intelligent-Tieringと組み合わせることで、レプリカ側のストレージコストを最適化できます。
最後に
S3 Tablesのレプリケーション機能を使って、東京-大阪間のクロスリージョンレプリケーションを試してみました。
- 設定は簡単: CLIまたはコンソールから数ステップで設定可能
- 自動複製: スナップショット、データ、メタデータがすべて自動的に複製される
- 柔軟な構成: テーブル単位/バケット単位、最大5デスティネーション
- 独立した保持期間: レプリカには異なるスナップショット保持期間を設定可能
- 国内DR構成: 東京-大阪間で国内完結のDR構成が構築可能
データレイクハウスにおける国内DR構成、分析ワークロードの分離、コンプライアンス対応などのユースケースに非常に有用な機能だと感じました。
合わせて読みたい






