DockerでMetabaseを構築する:手動データ抽出に代わる「セルフサービス」BIソリューション

Database tutorial - IT technology blog
Database tutorial - IT technology blog

「すみません、データを抽出してもらえますか?」という悪夢

昨年、私のチームは非常に厄介な状況に陥っていました。毎週月曜日の朝になると、マーケティングやセールスの担当者から「先週の新規登録ユーザーのリストを出して」「地域別の売上統計を教えて」といったメッセージが届くのです。

最初は簡単でした。5分ほどでSQLを書き、CSVファイルをSlackで送るだけです。しかし、会社が成長するにつれ、リクエストの数は週2〜3件から1日20件以上に増えていきました。

私はいつの間にか、不本意ながらも「データ抽出職人」になっていました。決定打となったのは、100GBのデータベースをMySQLからPostgreSQLへ移行していた時のことです。事前に周知していたにもかかわらず、上層部からはビジネスの進捗を確認するためにリアルタイムのレポートを求められました。その瞬間、チームには「セルフサービス型」のビジネスインテリジェンス(BI)システムが必要だと痛感しました。

なぜダッシュボードの自作は失敗に終わりがちなのか?

エンジニアの最初の反応は「管理画面を作って、Chart.jsでいくつかグラフを描けばいいだろう」というものです。私も試してみましたが、すぐに苦い経験をすることになりました。

  • メンテナンスの負担: マーケティング担当者が「棒グラフを円グラフに変えたい」と言い出すたびに、コードを修正し、テストして、再デプロイしなければなりません。
  • 権限管理の問題: 「上司には全データを、一般社員には自分の担当分だけを見せる」といった機能を自作するのは非常に手間がかかり、バグも発生しやすいです。
  • パフォーマンスのリスク: 重い集計クエリを最適化せずに実行すると、本番環境のデータベースがフリーズしてしまう恐れがあります。

数あるツールの中からMetabaseを選んだ理由

BIツールの市場には多くの選択肢がありますが、すべてがスタートアップに適しているわけではありません。

  • Tableau/PowerBI: 非常に強力ですが、ライセンス費用が高額(1ユーザーあたり月額約70ドル)で、小規模なチームには負担が大きすぎます。
  • Superset: Airbnb製の優れたツールですが、設定が複雑で、運用リソースを多く消費します。
  • Metabase: 最もバランスの取れた選択肢です。コードが書けない人でも使えるほど直感的なインターフェースを備えています。Dockerとの相性も良く、オープンソース版でも一般的なニーズには十分すぎるほど機能が揃っています。

DockerによるMetabaseのデプロイ:迅速、簡潔、そして安定

6ヶ月間の運用の末、私はDockerの使用を強くお勧めします。サーバーのアップグレードや移設が非常に簡単になります。Javaのインストールや複雑な環境変数の設定は不要で、docker-compose.ymlファイルを1つ用意するだけです。

ステップ1:Docker Composeの設定

metabase-biというディレクトリを作成し、以下の設定ファイルを作成します。ボリュームやデータベースの管理が難しくなるため、単発のdocker runコマンドは避けるべきです。

version: '3.9'
services:
  metabase:
    image: metabase/metabase:latest
    container_name: metabase_app
    ports:
      - "3000:3000"
    environment:
      - MB_DB_TYPE=postgres
      - MB_DB_DBNAME=metabaseappdb
      - MB_DB_PORT=5432
      - MB_DB_USER=metabase_user
      - MB_DB_PASS=your_secure_password
      - MB_DB_HOST=metabase_db
    restart: always
    depends_on:
      - metabase_db

  metabase_db:
    image: postgres:15-alpine
    container_name: metabase_postgres
    environment:
      - POSTGRES_DB=metabaseappdb
      - POSTGRES_USER=metabase_user
      - POSTGRES_PASSWORD=your_secure_password
    volumes:
      - ./metabase_data:/var/lib/postgresql/data
    restart: always

注意: デフォルトでは、Metabaseは設定の保存にH2データベースを使用します。このH2ファイルが破損すると、作成したダッシュボードをすべて失うことになります。上記の設定では、データの安全性を確保するためにPostgreSQLを「アプリケーションデータベース」として使用しています。

ステップ2:起動

準備が整いました。次のコマンドを実行するだけです。

docker-compose up -d

1〜2分待ってから、http://localhost:3000にアクセスしてください。ここで、管理者アカウントの作成やソースデータベースへの接続といった基本設定を行います。

データベース接続とデータセキュリティ

Metabaseは現在普及しているほとんどのデータベースに対応しています。ただし、接続には決してrootアカウントを使用しないでください。不慮のデータ改ざんを防ぐため、SELECT権限のみを持つ専用ユーザーを作成しましょう。

-- PostgreSQLの読み取り専用権限の設定
CREATE USER metabase_readonly WITH PASSWORD 'password';
GRANT CONNECT ON DATABASE your_db TO metabase_readonly;
GRANT USAGE ON SCHEMA public TO metabase_readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO metabase_readonly;

システムを「ダウン」させないための実践的なノウハウ

本番環境での運用はローカル環境とは大きく異なります。以下は私が学んだ教訓です。

1. リソース制限 (Resource Limits)

MetabaseはJVM上で動作するため、メモリを多く消費します。制限を設けないと、サーバーのリソースを使い果たし、OOM Killerが作動する可能性があります。Docker Composeに制限を追加しましょう。

deploy:
  resources:
    limits:
      memory: 2G

2. キャッシュの活用

複雑なダッシュボードの中には、データの読み込みに30秒以上かかるものもあります。Metabaseのキャッシュ機能を有効にすれば、すぐにレポートを確認できます。私は通常、前日の集計レポートに24時間のキャッシュを設定しています。

3. フルテーブルスキャンの警戒

ある時、マーケティング担当者がインデックスのない数千万件のlogsテーブルをスキャンするグラフを誤って作成してしまいました。その結果、データベースのCPU使用率が100%に達しました。ユーザーには、期間を7〜30日以内に制限するフィルタを必ず使うよう指導してください。

4. X-Rays機能:忙しい人の強い味方

これは私のお気に入りの機能です。Metabaseはテーブル構造を自動的に分析し、プロフェッショナルなダッシュボードを提案してくれます。created_atpriceといったフィールドを自動認識し、コードを一行も書かずに成長率のグラフなどを描画してくれます。

結びに代えて

Metabaseを導入したことで、手動レポート作成に費やしていた時間の80%を削減できました。今では各部署が自由にデータを探索しています。もしあなたがSQLデータベースを管理しており、本番環境での運用をよりプロフェッショナルなものにしたいと考えているなら、今すぐDockerとMetabaseの組み合わせを試してみてください。

Share: