Amazon Web Services ブログ
Amazon Redshift の Apache Iceberg 書き込みサポート入門 – Part 1
本記事は 2025 年 11 月 26 日 に公開された「Getting started with Apache Iceberg write support in Amazon Redshift – Part 1」を翻訳したものです。
多くの企業は、分析用の構造化データをデータウェアハウスに保存し、多様なデータセットは柔軟に処理できるようデータレイクに置いています。これまでは、両者の一貫性を保つために複雑な ETL 処理が必要で、データ同期の問題が起きるおそれもありました。
新しく登場した Amazon Redshift の Apache Iceberg 書き込みサポートでは、Amazon Simple Storage Service (Amazon S3) と S3 Tables に保存された Apache Iceberg テーブルに直接書き込めるため、こうした複雑さがなくなります。ネイティブな統合により、中間の ETL ステップを挟まずに Redshift のクエリからデータレイクへ直接データを書き込めます。また、ACID に準拠したトランザクションでデータの一貫性を保ちながら、柔軟なパーティショニング戦略でクエリのパフォーマンスを最適化できます。Apache Iceberg テーブルへの書き込みも、使い慣れた Redshift の SQL インターフェイスで行えます。たとえば、Redshift で複雑な変換を実行し、その結果を Apache Iceberg テーブルに直接書き込めば、Amazon EMR や Amazon Athena などの他の分析エンジンからすぐにクエリできます。この方法なら、データをコピーせずに、Redshift と他の分析ツールの両方から同じデータセットをクエリできます。
本記事では、Amazon Redshift から Amazon S3 と S3 Tables に保存された Apache Iceberg テーブルにデータを直接書き込み、ACID 準拠を保ったままデータウェアハウスとデータレイクをシームレスに統合する方法を紹介します。
「Verisk は Amazon Redshift と Apache Iceberg を使って、巨大災害リスクのモデリングで扱う数十億件のレコードを処理しています。クエリの集計は 30% 高速化し、ストレージコストも大幅に削減できました」
— Verisk、Associate Vice President、Karthick Shanmugam 氏
ソリューションの概要
Amazon Redshift の使い慣れた SQL コマンドで、Amazon S3 と S3 Tables に保存された Apache Iceberg テーブルを作成し、直接書き込めるようになりました。ここでは、AWS Lake Formation を使って S3 テーブルバケットの権限を設定する手順を説明します。最後に、Redshift ネイティブ形式と Apache Iceberg 形式にまたがる顧客と注文のデータセットを分析し、インサイトを引き出します。ワークフローは次の図のとおりです。

手順は次のとおりです。
- Amazon Redshift の SQL を使って、AWS Glue Data Catalog に customer_db という名前の外部データベースを作成します。
- Amazon Redshift の SQL を使って、Glue データベースに customer という名前の外部テーブルを作成し、顧客データを書き込みます。
- 注文データを書き込むため、Amazon S3 Tables に orders という名前のテーブルバケットを作成します。
- AWS Lake Formation で、orders テーブルの読み書きに必要な権限を IAM ロールに付与します。
- Amazon S3 のテーブルバケット orders に注文データを書き込みます。
本ソリューションでは、次の AWS サービスを使います。
前提条件
- Amazon Redshift のデータウェアハウス (プロビジョニング型または Serverless) を作成します。
- Redshift から AWS Glue Data Catalog にデータベースを作成する権限を用意します。
- Redshift クラスターと同じ AWS リージョンに、Amazon S3 バケットと S3 テーブルバケットを作成します。
- Lake Formation のデータレイク管理者である IAM ロールを使えるようにしておきます。手順については、「データレイク管理者を作成する」を参照してください。
- 次のインラインポリシーと信頼ポリシーを設定した IAM ロール
RedshifticebergRoleを作成します。
インラインポリシー:
- IAM ロール
RedshifticebergRoleを Redshift クラスターまたは Serverless 名前空間に関連付けます。 customer_dbという名前の AWS Glue データベースを新しく作成するか、任意の既存のデータベースを使います。別の名前を使う場合は、以降のコマンドのcustomer_dbを実際のデータベース名に置き換えてください。- Redshift Serverless 名前空間で識別子の大文字と小文字の区別が有効になっている場合は、Iceberg テーブルを作成する前に、次のコマンドを実行して無効にします。
SET enable_case_sensitive_identifier TO FALSE;
現在の設定を確認するには、次のコマンドを実行します。SHOW enable_case_sensitive_identifier;
環境のセットアップ
次の手順で環境をセットアップします。
Amazon S3 の汎用バケットに Apache Iceberg テーブルを作成する
- Query Editor V2 で Redshift に接続します。
- フェデレーティッドロール
RedshifticebergRole用のユーザーを作成します。 - Amazon Redshift の外部スキーマが設定されていることを確認します。Redshift で次のスクリプトを実行してください。
- 前の手順で作成した外部スキーマ demo_iceberg に、Apache Iceberg テーブル形式の外部テーブル customer を作成し、データを挿入します。列の定義を細かく制御したい場合や、後からデータを追加する予定がある場合は、この 2 段階の方法を使います。<<your-bucket>> の部分は、お使いの S3 バケット名に置き換えてください。
図 2: demo_iceberg.customer の結果 - ユーザー
IAMR:RedshifticebergRoleに外部スキーマへのアクセス権を付与します。
Amazon S3 のテーブルバケットに Apache Iceberg テーブルを作成する
Amazon S3 のテーブルバケットは、データアクセス権限を一元的に管理する AWS Lake Formation と統合されています。Apache Iceberg テーブルを扱う場合、Lake Formation の統一されたセキュリティフレームワークにより、データレイク全体のアクセス制御がシンプルになります。アクセス権限を一か所にまとめることで、一貫性のある効率的な管理ができ、複数の場所で権限を扱う必要がなくなります。
S3 テーブルバケットを作成するには、次の手順を実行します。
- Amazon S3 を開き、左のナビゲーションペインで Table buckets を選択します。
- Table buckets ページの Integration with AWS analytics services セクションで、Enable integration を選択します。

- Table buckets の一覧で Create table bucket ボタンを選択し、テーブルバケットの名前 (例: iceberg-write-blog) を入力して、Create table bucket を選択します。作成したバケットは、Lake Formation コンソールの S3 テーブルカタログ s3tablescatalog に表示されます。
- AWS Lake Formation コンソールで Catalogs を選択し、Catalogs テーブルで s3tablescatalog を選択して詳細ページを開きます。

- s3tablescatalog の詳細ページの Catalogs で、テーブルバケット iceberg-write-blog を選択します。
- iceberg-write-blog の詳細ページの Databases で、Create database を選択します。
- データベース名に iceberg_write_namespace と入力し、ドロップダウンメニューから Catalog を選択して、Create database を選択します。

- Lake Formation の IAM ロールに、データベース内でテーブルを作成する権限を付与します。iceberg-write-blog の詳細ページで iceberg_write_namespace のラジオボタンを選択し、Actions、Grant の順に選択します。

- Grant permissions ページの Principal type で Principals を選択し、Principals で IAM users and roles を選択して、IAM users and roles のドロップダウンメニューから RedshifticebergRole を選択します。

- LF-Tags or catalog resources で Named Data Catalog resources を選択し、Catalogs で iceberg-write-blog を、Databases で iceberg_write_namespace を選択します。

- Database permissions で Create table、Drop、Describe のチェックボックスをオンにし、Grant を選択します。

Amazon S3 のテーブルバケットを使って Amazon Redshift で Apache Iceberg テーブルを作成する
AWS Lake Formation のカタログは、同じアカウントの Amazon Redshift データウェアハウスに自動でマウントされます。Amazon Redshift は、自動マウントされた S3 テーブルカタログを使って S3 Tables に直接書き込みます。S3 テーブルバケットに保存された Apache Iceberg テーブルに書き込む SQL の構文は、S3 の汎用バケットに保存された Apache Iceberg テーブルの場合とほぼ同じです。大きな違いは、自動マウントされた S3 テーブルカタログが 3 つの部分からなる表記でのアクセスに対応している点です。そのため、S3 テーブルバケットにあるデータレイクの Apache Iceberg テーブルを参照するときに、EXTERNAL SCHEMA を作成する必要がなくなります。
Apache Iceberg テーブルを作成するには、次の手順を実行します。
- RedshifticebergRole に切り替えます。Redshift Query Editor V2 から S3 Tables にアクセスするには、フェデレーティッドユーザーのアカウントを使う必要があります。RedshifticebergRole には、必要な Lake Formation の権限を付与済みです。
- Query Editor V2 の Federated user オプションで Redshift にログインします。

- Query Editor V2 で、Apache Iceberg テーブル形式の orders テーブルを作成します。
- 標準の SQL でテーブルにデータを挿入します。
- Redshift に local_orders テーブルを作成し、サンプルのレコードを挿入します。
CREATE TABLE AS (CTAS)の形式で、既存のテーブルから圧縮なしのテーブルを作成します。- 3 つの部分からなる表記を使い、標準の SQL でデータをクエリします。
USE句でデフォルトのデータベースを指定して、データベース名を省略することもできます。結果のテーブルは次のようになります。

- スキーマの検索パスを設定すれば、表記からスキーマ名を省略でき、テーブルへのアクセスがさらにシンプルになります。
- テーブルの定義を表示します。
データを組み合わせる
次の 2 つのソースのデータを組み合わせ、1 つのクエリで連携させる方法を紹介します。
- S3 の汎用バケットに保存された顧客データ
- S3 テーブルバケットに保存された注文データ
- フェデレーティッドユーザーで Redshift にログインします。
2 つのソースを組み合わせたクエリの結果は次のとおりです。

- テーブルを削除します。
クリーンアップ
継続的な課金を避けるため、次の手順を順番に実行します。
- Apache Iceberg テーブルを削除します。
- S3 のオブジェクトを削除します。your-bucket は、作成したバケットの名前に置き換えてください。
- Lake Formation の権限を削除します。your-bucket は、作成したバケットの名前に置き換えてください。
まとめ
Amazon Redshift の Apache Iceberg 書き込みサポートを使えば、データウェアハウスのパフォーマンスとデータレイクのスケーラビリティを兼ね備えた柔軟なデータアーキテクチャを構築できます。ACID 準拠を保ち、クエリを最適化するパーティショニングも使いながら、Apache Iceberg テーブルにデータを直接書き込めるようになりました。Amazon Redshift でデータレイクに Apache Iceberg テーブルを作成すれば、Amazon EMR や Amazon Athena からすぐにクエリできます。
本シリーズの Part 2 では、Apache Iceberg テーブルに DELETE、UPDATE、MERGE を実行し、ACID 準拠を保ちながら行レベルでデータを変更する方法を紹介します。
詳しくは、ドキュメントの「Apache Iceberg の Amazon Redshift との互換性」と「Apache Iceberg テーブルへの書き込み」を参照してください。最新情報は AWS Database Blog でご覧いただけます。
著者について
この記事は Kiro が翻訳を担当し、Solutions Architect の Woosuk Choi がレビューしました。