本文へスキップ
hdknr blog
戻る

Redshift か、S3 + Iceberg のレイクハウスか:DWH とオープンテーブルフォーマットの選び方

AWS で分析基盤を作るとき、まず候補に挙がるのが Amazon Redshift です。一方で、S3 に Apache Iceberg 形式でデータを置き、Athena や Spark、DuckDB から読むレイクハウスという作り方も広まっています。

この記事は、次の 2 本に続くシリーズの 3 本目です。

前の 2 本では Iceberg と DuckLake というテーブルフォーマット同士を比べました。今回は一段上がって、「データを Redshift の中に持つか、S3 にオープンな形式で持つか」というアーキテクチャの選び方を整理します。両者の位置づけの違い、Redshift Serverless・Athena・DuckDB の料金構造、Redshift から Iceberg に書き込む方法と制約、構成の選び方を順に見ていきます。

結論を先に書くと、共有するデータは S3 の Iceberg テーブルに置き、BI から何度も読まれる集計だけを Redshift に持つ組み合わせが現実的です。

Redshift と Iceberg は同じ土俵にない

最初に押さえておきたいのは、Redshift と Iceberg は直接比べるものではない、という点です。

さらに、2025 年 11 月以降の Redshift は Iceberg テーブルを読むだけでなく書くこともできます。つまり、両者は「どちらか」ではなく組み合わせられる関係です。そのため比べるべきは、データの置き場所になります。

なお、DuckLake は 2 本目で見たとおり DuckDB を中心としたフォーマットです。Redshift や Athena と同じデータを共有するなら、この記事では Iceberg を前提に考えます。

データの置き場所で比べる

DWH 一体型とレイクハウスの構成を比べた図。左の DWH 一体型では、BI やアプリケーションが Amazon Redshift にアクセスし、Redshift の中に計算(Serverless の RPU またはノード)、テーブル管理(内部のカタログ)、Redshift マネージドストレージ(RMS)がまとまっている。右のレイクハウスでは、Redshift、Athena、Spark(Glue・EMR)、DuckDB の各エンジンが AWS Glue Data Catalog または S3 Tables のカタログを経由して、Amazon S3 上の Apache Iceberg テーブルを読み書きする。Redshift もエンジンの 1 つとして並んでいる

Redshift のテーブルデータは、Redshift マネージドストレージ(Redshift Managed Storage、以下 RMS)に保存されます。RMS は計算から切り離されたストレージ層で、計算リソースとは別に容量が伸縮し、料金も別に課金されます。

観点Redshift にデータを持つ(RMS)S3 に Iceberg で持つ(レイクハウス)
データの形式Redshift 内部の形式Parquet + Iceberg のメタデータ(オープン)
読み書きできるエンジン基本は Redshift のみRedshift、Athena、Spark、DuckDB など
テーブル管理Redshift 内部AWS Glue Data Catalog / S3 Tables
トランザクション通常の DWH として複数文のトランザクションが使えるエンジンごとの制約あり(Redshift は後述、DuckDB は 1 本目を参照)
ベンダーロックイン強い弱い(形式がオープン)

Redshift Serverless と Athena・DuckDB の料金の違い

Redshift には、ノード数を決めて常時起動するプロビジョンド型と、使った分だけ課金される Redshift Serverless があります。ここでは Serverless を中心に見ます。料金ページの記載は次のとおりです(金額はバージニア北部リージョンの計算例)。

項目内容
計算RPU(Redshift Processing Unit)× 時間で課金。計算例では 1 RPU 時間あたり $0.375
基本容量4〜1024 RPU の範囲で設定
課金単位秒単位(最低 60 秒)
アイドル時課金なし
ストレージ(RMS)計算例では 1 GB・月あたり $0.024
S3 上の外部データへのクエリ別課金ではなく、RPU 時間に含まれる

計算例の単価で最小の 4 RPU を動かすと、1 時間あたり $1.50 です(料金ページにも「as low as $1.50 per hour」とあります)。アイドル時に課金されないので、日中だけ使うような負荷なら Serverless が合います。

レイクハウス側の代表である Athena は、料金ページの計算例ではスキャンしたデータ 1 TB あたり $5 です。DuckDB は自分の PC や Lambda で動かすので、エンジンの利用料はかからず、実行環境のコストだけになります。レイクハウス側のデータは S3 に置くので、ストレージは S3 の通常の料金です。

ここから言えるのは、料金の構造が違うということです。

どれが安いかはクエリの頻度とデータ量で逆転するので、一概には言えません。実際の見積もりは、自分のリージョンの料金で試算してください。

なお、プロビジョンド型の場合は、混雑時に自動で処理能力を足す Concurrency Scaling の無料枠が、1 日最大 1 時間分たまります。

Redshift から Iceberg を読み書きする

Redshift の Iceberg 対応は、2025 年 11 月から 2026 年 8 月にかけて大きく広がりました。

時期内容
2025 年 11 月Iceberg テーブルへの書き込みが GA(一般提供)に。CREATE TABLE、INSERT など
2026 年 5 月Iceberg テーブルへの ALTER TABLE と、自動マウントされる awsdatacatalog 経由の書き込みに対応
2026 年 8 月Iceberg v3 テーブル(削除ベクター、行の系譜(row lineage)、列の既定値)に対応

v3 の削除ベクターは、2 本目で触れた DuckLake の削除ベクターと同じく、削除した行をビットマップで持つ仕組みです。

現行のドキュメントでは、CREATE TABLE、CREATE TABLE AS SELECT、INSERT、UPDATE、DELETE、MERGE が使えます。Iceberg テーブルは AWS Glue Data Catalog(以下 Glue Data Catalog)に登録されている必要があり、プロビジョンド型と Serverless のどちらからも書き込めます。

次の例の <...> は、自分の環境の値に置き換えてください。まず、Glue Data Catalog(自動マウントされた awsdatacatalog)上に Iceberg テーブルを作って書き込む場合です。

CREATE TABLE awsdatacatalog.<Glue データベース>.orders (
  order_id INT,
  status VARCHAR,
  region VARCHAR
)
USING ICEBERG
LOCATION 's3://<汎用バケット>/orders/';

INSERT INTO awsdatacatalog.<Glue データベース>.orders
VALUES (1, 'pending', 'us-east-1');

S3 Tables のテーブルバケットに作る場合は、"<バケット名>@s3tablescatalog" という 3 部構成の名前を使います。テーブルの場所は S3 Tables が決めるので、LOCATION は書きません。

CREATE TABLE "<テーブルバケット>@s3tablescatalog".<名前空間>.orders (
  order_id INT,
  status VARCHAR,
  region VARCHAR
)
USING ICEBERG;

INSERT INTO "<テーブルバケット>@s3tablescatalog".<名前空間>.orders
VALUES (1, 'pending', 'us-east-1');

ここで作ったテーブルは、Athena や Spark からも、DuckDB からも(1 本目の「カタログに ATTACH する」の手順で)同じように読めます。Redshift で集計した結果を Iceberg テーブルとして書き出し、ほかのチームは別のエンジンで使う、という分担ができるわけです。

Iceberg への書き込みの制約

一方で、Redshift の内部テーブル(RMS)と同じ感覚では使えません。トランザクションの仕様には、次の制約があります。

複数のテーブルをまとめて更新する ETL や、ストアドプロシージャで組んだ既存の処理は、RMS のテーブルに残すほうが無難です。

Redshift・Iceberg・DuckDB の使い分け

ここまでの 3 本をまとめると、選び方は次のようになります。

状況おすすめの構成
分析するのは 1 人〜少人数で、データが 1 台のマシンで扱える規模DuckDB + DuckLake(または S3 上の Iceberg を DuckDB で読む)
複数のチームが別々のエンジンで同じデータを使うS3 + Iceberg(Glue Data Catalog / S3 Tables)を中心にする
多数のユーザーが BI ダッシュボードから同時にクエリするRedshift(RMS)にデータを持つ
複数チームでの共有と、BI からの同時アクセスの両方がある共有データは Iceberg、頻繁に読む集計は Redshift の RMS

誰が、どう使うかで考える

この表を、使い方の違いとして言い直すと次のようになります。

ただし、「データを広く開示する」には 2 つの意味があり、どちらを指すかで向いている構成が逆になります。

「広く開示する」の意味向いている構成
多くの人が、同じ定型の集計を BI から同時に見るDWH 一体型(Redshift の RMS)
多くのチームやシステムが、同じ元データを別々のツールで使うレイクハウス(S3 + Iceberg)

後者で大事なのは、データを特定の製品に閉じ込めないことです。そのため、利用者が多くてもレイクハウスのほうが有利になります。

実際の組織では、この 2 つの使い方が同時に起きることがほとんどです。そのため、使い分けの表の最後の行にある組み合わせになることが多いはずです。生データや履歴は S3 の Iceberg テーブルに置き、どのエンジンからも読めるようにしておきます。そのうえで、BI から何度も読まれる集計テーブルだけを Redshift の RMS に持ち、同時実行性能を確保します。

Redshift から Iceberg に書けるようになったので、「Redshift を使う=データを Redshift に閉じ込める」ではなくなりました。AWS 上で複数のエンジンやチームがデータを共有する前提なら、最初から Redshift に全部入れる必要はありません。まず Iceberg で持つことを基本にし、性能が必要な部分だけ Redshift に寄せます。この順番で考えると、あとで構成を変えやすくなります。

DuckDB だけで小さく始める場合は、2 本目で見たとおり、まず DuckLake で始めて、必要になったら Iceberg へ移す道もあります。

まとめ



前の記事
Apache Iceberg 入門:データレイクを「テーブル」にする仕組みと DuckDB との関係
次の記事
REA とは?AI エージェントにリバースエンジニアリングさせる MCP ツールの使い方と注意点