【S3 Tables】汎用バケットで作成したIcebergのテーブルをそのままS3Tablesに移行できるのか?

【S3 Tables】汎用バケットで作成したIcebergのテーブルをそのままS3Tablesに移行できるのか?

Clock Icon2025.03.05

データ事業本部の川中子(かわなご)です。

今日はタイトルの通り、汎用バケットで作ったIceberg形式のテーブルを、
情報を全て保持した状態でS3 Tabelsに移行できるのか
、というお話です。

本記事の執筆時点(2025/03/05)ではまだ、S3 Tablesの分析サービス統合はプレビュー状態なので、
本格的にS3 TablesでのIceberg運用に踏み切れないという方もいるのではないでしょうか。

そんな時にふと思ったのは、「汎用バケットでIcebergのテーブルを運用しておいて、
分析サービス統合が東京リージョンでGAになったら、S3 Tablesに移行すればいい?」ということでした。

今回はS3 Tablesへの移行について情報を整理したので、記事として残したいと思います。

結論

まず結論ですが、

データの移行はできるが、スナップショットなどの情報は基本的に移行できない

となります。

データの移行については、移行先のテーブルに対してINESRTを実行するだけで、
任意のバージョン、状態のデータを移行することが可能です。これは当然ですね。

そしてスナップショットなどの情報ですが、これは S3 Tablesのメタデータ管理場所が問題 になります。
後に解説しますが、 汎用バケットで管理しているメタデータを移すことができない ため、
それらに紐づいているスナップショットなどの情報はそのまま移行することはできません。

Icebergテーブルのメタデータ管理の仕組みについてはこちらをご参照下さい。

https://iceberg.apache.org/spec/

やってみる

では実際に汎用バケット管理のIcebergのテーブルからデータ移行をやってみます。

移行先のテーブル作成

データ移行先として、S3 Tablesにテーブルを作成していきます。
S3 Tablesのテーブル作成はコンソールからだと実行できないので、CLIから作成しました。

aws s3tables create-table --cli-input-json file://schema.json

使用したスキーマファイルは以下になります。

cat schema.json
{
    "tableBucketARN": "{テーブルバケットのARN}",
    "namespace": "20250218_namespace",
    "name": "migration_test",
    "format": "ICEBERG",
    "metadata": {
        "iceberg": {
            "schema": {
                "fields": [
                    {"name": "id", "type": "int","required": true},
                    {"name": "letter", "type": "string"},
                    {"name": "name", "type": "string"}
                ]
            }
        }
    }
}

Athenaからテーブルを見ると、もちろんデータは空の状態です。

pasted-2025.03.05-10.38.36

移行元のテーブルを確認

次にデータの移行元となるテーブルを確認します。

SELECT * FROM default.migration_test order by id;

pasted-2025.03.05-10.40.21

このデータは1-5行目、6-8行目で2回に分けてデータをINSERTしたもので、
スナップショットの情報を確認すると2行分の情報が確認できます。

SELECT * FROM default."migration_test$snapshots";

スクリーンショット 2025-03-05 15.54.14

このテーブルのメタデータやデータの実体はS3の方で確認ができます。

aws s3 ls s3://cm-kawanago-oregon/ --recursive
2025-03-04 14:19:28          0 migration_test/
2025-03-04 14:30:20        492 migration_test/data/O9upAA/20250304_053018_00099_ifs54-47a0d53a-f327-413c-afff-553a01b76b83.parquet
2025-03-04 14:22:19        534 migration_test/data/p8qJqQ/20250304_052218_00076_adw5z-393f7315-ec40-4b99-9b49-f1551c65c33e.parquet
2025-03-04 14:19:51       1234 migration_test/metadata/00000-6836d669-f7f7-4455-9471-04198d1799af.metadata.json
2025-03-04 14:22:20       2315 migration_test/metadata/00001-a8200fae-67b0-4c7f-ae3d-2381f56b2eef.metadata.json
2025-03-04 14:30:21       3341 migration_test/metadata/00002-7e33c679-eb6e-4c04-8591-eb5494bb5259.metadata.json
2025-03-04 14:22:20       6777 migration_test/metadata/55e21b21-052f-4e76-b352-05311d158396-m0.avro
2025-03-04 14:30:20       6771 migration_test/metadata/f10ee7d5-77a1-40a0-b8dd-9819c9f5590c-m0.avro
2025-03-04 14:22:20       4262 migration_test/metadata/snap-5192048834673345618-1-55e21b21-052f-4e76-b352-05311d158396.avro
2025-03-04 14:30:20       4336 migration_test/metadata/snap-8197720050845012234-1-f10ee7d5-77a1-40a0-b8dd-9819c9f5590c.avro

データを移行する

Athenaを使ってS3 TabelsのIcebergテーブルにデータを移してみます。

INSERT INTO migration_test
SELECT * FROM AwsDataCatalog.default.migration_test;

S3tablesのテーブルにデータが格納されたことを確認できました。

SELECT * FROM "20250218_namespace"."migration_test" order by id;

pasted-2025.03.05-10.40.57

では移行先のIcebergテーブルのスナップショット情報を見てみましょう。

SELECT * FROM "20250218_namespace"."migration_test$snapshots";

スクリーンショット 2025-03-05 16.08.26

...ということでAthenaからはS3 Tablesのスナップショット情報を見れませんでした。
この辺りはデータ分析サービスとの統合がGAされたら使えるようになるかも知れません。

ということでsparkからテーブルの情報を見る方法に切り替えました。
CloudShellでのspark実行環境は以下のブログを参考に立ち上げました。

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

sparkからS3 Tables上のテーブルのスナップショット情報を見てみます。

scala> spark.sql("SELECT * FROM s3tablesbucket.20250218_namespace.migration_test.snapshots").show()

1741154889172

こちらで確認できたスナップショットIDは887343600925304146で、
移行元のスナップショットは51920488346733456188197720050845012234だったので、
やはりスナップショットの情報は移行できていないことが分かります。

S3 Tablesのメタデータはどこにある?

上記検証でスナップショットの情報は移行できないことが分かりましたが、
それは 移行元のメタデータを管理しているファイル類については一切移行していないため です。

では汎用バケットの方に出力されていたメタデータファイル類を、
S3 Tablesのメタデータを管理場所に移せばスナップショットの情報も移行できそうですが、
肝心の S3 Tablesのメタデータファイルはどこで管理されている のでしょうか。

こちらはaws s3tables get-table-metadata-locationコマンドで確認できます。

https://docs.aws.amazon.com/cli/latest/reference/s3tables/get-table-metadata-location.html

aws s3tables get-table-metadata-location \
    --table-bucket-arn {テーブルバケットのARN} \
    --namespace 20250218_namespace \
    --name migration_test
{
    "versionToken": "d7d0989ad938b3f5ee72",
    "metadataLocation": "s3://cf0c3935-2cb7-{中略}-8345-bb5153027425.metadata.json",
    "warehouseLocation": "s3://cf0c3935-2cb7-{中略}usw2b--table-s3"
}

上で表示されているmetadataLocationにメタデータファイル類が管理されているようです。
ダメ元でwarehouseLocationの中を見ようとしてみましたが、やはりダメでした。

aws s3 ls s3://cf0c3935-2cb7-{中略}usw2b--table-s3/ --recursive

An error occurred (MethodNotAllowed) when calling the ListObjectsV2 operation: The specified method is not allowed against this resource.

S3 Tablesのメタデータが管理されているバケットは分かりましたが、
そのバケットの中身にユーザー触れることはできないため、やはりメタデータの移行はできなさそうです。

さいごに

今回はS3 TablesへのIcebergテーブルのデータ移行について考えてみました。
データの移行はもちろんできますが、スナップショット情報の引き継ぎは難しい という結論になりました。

ただ1つ、本検証では触れていないのですが、スナップショット情報などを含めたデータ移行として、
テーブルに紐づくメタデータの管理場所を変更するコマンドが使えるかも知れません。

https://docs.aws.amazon.com/cli/latest/reference/s3tables/update-table-metadata-location.html

上記コマンドを使い、移行先となるS3 Tablesのテーブルの メタデータ管理場所を、
移行元テーブルのメタデータ管理場所に変更すれば、そのままデータ移行ができる
のでしょうか。

ただメタデータの管理が汎用バケットの方に移るので、アクセス制御が追加で発生 したり、
S3 Tablesの 自動メンテナンス機能が正常に稼働するか などの懸念はありそうです。
この検証についてはまた別の機会にやってみたいと思います。

最後まで記事を閲覧頂きありがとうございました。
少しでも参考になれば幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.