🦆

DuckDB UIをEC2上で使えなかった話

に公開

DuckDBをエンジニア以外にも展開したい

はじめに

株式会社DeltaXでCTOを務める福田です。

近年、データドリブンな意思決定が重要視される中、エンジニア以外のメンバーにも手軽にデータ分析環境を提供したいというニーズが高まっています。DeltaXでもBigQueryを使ってデータの解析を行っていますが、大量のアクセスログファイルなどはAWS内に残っているデータもあります。
そういったデータはS3内にParquet形式などで保存されていますが、いままではAthenaを使って解析を行っていました。
最近ではJSON,CSV,Parquetなど、ありとあらゆるデータを読み込むことができるDuckDBが注目されています。データのソースとしてS3のパスを直接指定することも可能です。

しかしCLIツールであるため、いざ非エンジニア向けに展開しようとすると、難しい面がありました。


DuckDBとは何か?

DuckDBは「組み込み型の分析データベース(in-process OLAP)」として設計された、モダンなデータ分析基盤です。従来のデータベースシステムとは異なり、サーバーレスで動作し、アプリケーションプロセス内で高速な分析処理を実現します。

技術的特徴

【アーキテクチャ】

  • サーバーレス設計: 専用サーバー不要、単一プロセス内で完結
  • 列指向ストレージ: OLAP(分析処理)に最適化された内部構造
  • ベクトル化実行エンジン: CPU効率を最大化する実行最適化

【データ処理能力】

  • 多様なデータソース: Parquet、CSV、JSON等を直接クエリ
  • クラウドネイティブ: S3、GCS等のオブジェクトストレージに対応
  • 標準SQL: 豊富な分析関数をサポート

【運用性】

  • ゼロコンフィグ: 複雑な設定やチューニングが不要
  • 軽量デプロイ: 単一バイナリまたはライブラリとして配布
  • マルチプラットフォーム: Python、R、JavaScript等からの利用が可能

端的に言えば「SQLiteの分析特化版」です。データエンジニアリングの複雑性を抑えつつ、エンタープライズ級の分析処理を実現します。

DuckDBの実用性:なぜ組織に導入したいのか

データ分析の民主化において、DuckDBが提供する価値は以下の点で際立っています。

1. インフラストラクチャの簡素化

従来のアプローチでは、データ分析基盤として以下が必要でした:

  • 専用のデータウェアハウス(Redshift、BigQuery等)
  • ETLパイプラインの構築・運用
  • 分析用サーバーの管理

DuckDBのアプローチでは:

-- S3上のデータを直接分析(インフラ追加なし)
INSTALL httpfs;
LOAD httpfs;
SET s3_region='ap-northeast-1';

SELECT date_trunc('month', order_date) as month,
       category,
       sum(amount) as total_sales
FROM read_parquet('s3://company-data/sales/*.parquet')
WHERE order_date >= '2025-01-01'
GROUP BY 1, 2
ORDER BY 1 DESC, 3 DESC;

2. 分析の即時性

データパイプラインの構築を待つことなく、S3に配置されたデータを即座に分析可能:

-- 複数のデータソースを瞬時に結合
SELECT 
    u.department,
    s.product_category,
    sum(s.revenue) as total_revenue
FROM read_parquet('s3://hr-data/users.parquet') u
JOIN read_csv('s3://sales-data/transactions/*.csv', AUTO_DETECT=true) s
  ON u.user_id = s.user_id
WHERE s.transaction_date >= current_date - interval '30 days'
GROUP BY 1, 2;

3. 分析結果の永続化

分析結果を効率的にS3に保存し、チーム間での共有を実現:

-- 分析結果をParquet形式で保存
COPY (
  SELECT * FROM monthly_sales_summary 
  WHERE year = 2025
) TO 's3://reports/2025-sales-summary.parquet'
(FORMAT PARQUET, COMPRESSION ZSTD);

これらの特徴により、従来のデータエンジニアリングコストを大幅に削減しながら、高度な分析環境を提供できるのがDuckDBの魅力です。


DuckDB Local UIとは何か?

このようにDuckDBは有用なのですが、主たるインターフェースはCLIで、非エンジニアには敷居がありました。そこに登場したのがDuckDB Local UI(以下、Local UI)です。Webサーバーとして起動し、ブラウザ経由でDuckDBを利用できます。
これを使えば非エンジニアにも展開できるのではと考えました。

参考:機能の全体像は公式の紹介記事がわかりやすいです。


なぜEC2でホスティングしたいのか?

背景(狙い)

  • S3上のデータ(Parquet等)をDuckDBで直接分析できる利点を、非エンジニアにも開放したい
  • 通信量とセキュリティの観点から、AWS内にサーバーを置いてWeb UIで提供できれば理想的(VPN経由で各自のブラウザからアクセス)

仮説(当初の想定)

  • 「DuckDBにはLocal UIがある。これをEC2上で立ち上げ、チームに配布すればよいのでは?」

検証と結果(使ってみて分かったこと)

  1. 起動時にブラウザを自動で開こうとする
  2. リモートアクセスを前提としていない(localhost前提)
  3. UIアセットはui.duckdb.orgから取得(リバースプロキシ)
    • 一部のサブネットなど外部接続制限のあるネットワークでは利用が難しい

補足(コミュニティでの動き)

結論(現時点の理解)

  • 名称の通り、DuckDB Local UIは「ローカル利用」を前提とした設計であり、サーバー常駐で多数に配る用途は現状の前提外

参考:公式の紹介記事(全体像)

関連Issues(挙動・方針の議論)


実装根拠とコード断片(解析メモ)

以下は、ui extension(DuckDBのUI拡張、C++)の実装です。

  1. リッスンアドレス(localhost固定)
  • ファイル: src/http_server.cpp
  • 断片:
server.listen("localhost", local_port);
  • 補足: UIのローカルHTTPサーバーはlocalhostに固定バインドされます。0.0.0.0での待受けは現状想定されていません(Issue #22参照)。
  1. ブラウザ自動起動の仕組みと抑止関数
  • ファイル: src/ui_extension.cpp
  • 断片(自動起動):
const auto command = StringUtil::Format("%s %s", OPEN_COMMAND, local_url);
return system(command.c_str());
  • 断片(登録関数):
REGISTER_TF("start_ui", StartUIFunction);           // ブラウザ自動起動あり
REGISTER_TF("start_ui_server", StartUIServerFunction); // 自動起動なし
  • 補足: ヘッドレス環境ではstart_ui_server()の利用で自動起動を避けられます(Issue #27の文脈)。
  1. リモートUIアセット(ui.duckdb.org)へのプロキシ
  • ファイル: src/include/settings.hpp, src/http_server.cpp
  • 断片(デフォルト設定):
#define UI_REMOTE_URL_SETTING_DEFAULT "https://ui.duckdb.org"
  • 断片(プロキシ):
httplib::Client client(remote_url);
auto result = client.Get(req.path, req.params, headers);
  • 補足: UIの静的アセット(HTML/JS/CSS等)をui.duckdb.orgから取得する設計のため、インターネット到達性が前提です。閉域・私設ネットワークでは、そのままでは動作しません。

まとめ

  • DuckDBは「手元で完結する高速OLAPエンジン」として非常に有用で、S3/Parquetを直接扱える点が大きな強み
  • DuckDB Local UIはローカル利用に最適化された公式GUIであり、非エンジニアのオンボーディングに効果的
  • 一方で、サーバー/ヘッドレス環境でのホスティングやリモート多人数利用は、現状は想定外(Issues #22/#27参照)
  • nginxでリバースプロキシすることも検討しているが、他の方法も検討中

付記

本記事のDuckDB Local UIに関する解析はSerenaとClaude Codeで実施し、ブログ記事の執筆にはCodexを使用しました。

株式会社DeltaX

Discussion